Ansible 经过读取默认的主机清单配置/etc/ansible/hosts,来同时链接到多个远程主机,来执行远程操做任务的,可是若是要修改默认路径能够经过修改主配置文件 ansible.cfg 的 hostfile 参数指定相应的路径。具体查看相应的路径为:php
[root@Monitor ansible]# vim ansible.cfg remote_port = 22 remote_user = root private_key_file = ~/.ssh/id_rsa_web host_key_checking = False hostfile = /etc/ansible/conf/hosts
接下来会详细讲解主机和组,以及他们的正则表达式的匹配:
html
(一)主机和组(Hosts and Groups)java
经过配置/etc/ansible/hosts这个文件来定义主机和组python
(1)简单的主机和组nginx
[root@Monitor ansible]# vim /etc/ansible/conf/hosts [webserver] ###定义组名 #192.168.180.4 ###定义主机 192.168.180.5 192.168.180.6 192.168.180.23 [dbserver] 192.168.180.2 [root@Monitor ansible]# ansible webserver -m command -a 'uptime' 192.168.180.23 | SUCCESS | rc=0 >> 15:00:30 up 45 days, 23:43, 4 users, load average: 0.00, 0.01, 0.05 192.168.180.5 | SUCCESS | rc=0 >> 15:01:10 up 45 days, 23:44, 2 users, load average: 0.00, 0.00, 0.00 192.168.180.6 | SUCCESS | rc=0 >> 15:01:27 up 45 days, 23:44, 2 users, load average: 2.00, 2.00, 2.00
注意的要点有:web
a.中括号中的名字表明组名,能够根据本身的需求将庞大的主机分红具备标识的组,如上面分了两个组webservers和dbservers组;正则表达式
b.主机(hosts)部分可使用域名、主机名、IP地址表示;固然使用前二者时,也须要主机能反解析到相应的IP地址,通常此类配置中多使用IP地址;shell
(2)端口与别名。vim
SSH默认的端口是22(此时的ansible主机配置文件能够省略),可是若是某些主机的SSH运行在自定义的端口上,ansible使用Paramiko进行ssh链接时不会使用你SSH配置文件中列出的端口,可是若是修改ansible使用openssh进行ssh链接时将会使用:ruby
######在client192.168.180.5上ssh开启了2个端口链接 [root@localhost ~]# vim /etc/ssh/sshd_config # $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $ # This is the sshd server system-wide configuration file. See # sshd_config(5) for more information. # This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin # The strategy used for options in the default sshd_config shipped with # OpenSSH is to specify options with their default value where # possible, but leave them commented. Uncommented options change a # default value. Port 10022 Port 22
######在ansible服务端的配置: [root@Monitor ansible]# vim /etc/ansible/conf/hosts [webserver] #192.168.180.4 192.168.180.5:10022 192.168.180.6 192.168.180.23 [root@Monitor ansible]# ansible webserver -m command -a 'uptime' 192.168.180.23 | SUCCESS | rc=0 >> 16:12:33 up 46 days, 55 min, 4 users, load average: 0.00, 0.01, 0.05 192.168.180.5 | SUCCESS | rc=0 >> 16:14:58 up 22 min, 3 users, load average: 0.00, 0.00, 0.00 192.168.180.6 | SUCCESS | rc=0 >> 16:13:43 up 46 days, 56 min, 2 users, load average: 2.00, 2.00, 2.00
(3)指定主机范围
hosts官方有个列子是经过指定主机名的范围来进行多台主机的定义
[root@Monitor ansible]# vim /etc/ansible/conf/hosts [webservers] www[01:50].yanruogu.com [databases] db-[a:f].yanruogu.com
上面指定了从web1到web50,webservers组共计50台主机;databases组有db-a到db-f共6台主机。
(4)使用主机变量
hosts主机常常使用到的变量为:
ansible_ssh_host #用于指定被管理的主机的真实IP ansible_ssh_port #用于指定链接到被管理主机的ssh端口号,默认是22 ansible_ssh_user #ssh链接时默认使用的用户名 ansible_ssh_pass #ssh链接时的密码 ansible_sudo_pass #使用sudo链接用户时的密码 ansible_sudo_exec #若是sudo命令不在默认路径,须要指定sudo命令路径 ansible_ssh_private_key_file #秘钥文件路径,秘钥文件若是不想使用ssh-agent管理时可使用此选项 ansible_shell_type #目标系统的shell的类型,默认sh ansible_connection #SSH 链接的类型: local , ssh , paramiko,在 ansible 1.2 以前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提) ansible_python_interpreter #用来指定python解释器的路径,默认为/usr/bin/python 一样能够指定ruby 、perl 的路径 ansible_*_interpreter #其余解释器路径,用法与ansible_python_interpreter相似,这里"*"能够是ruby或才perl等其余语言
上边的实例也能够以下配置直接使用用户名和密码和端口号进行链接
[root@Monitor ansible]# vim /etc/ansible/conf/hosts [webserver] #192.168.180.4 192.168.180.5 ansible_ssh_port=10022 ansible_ssh_user=root ansible_ssh_pass='123456' 192.168.180.6 ansible_ssh_user=root ansible_ssh_pass='123456' 192.168.180.23 ansible_ssh_user=appuser ansible_ssh_pass='123456' [root@Monitor ansible]# ansible webserver -m command -a 'uptime' 192.168.180.5 | SUCCESS | rc=0 >> 16:54:09 up 1:01, 3 users, load average: 0.00, 0.00, 0.00 192.168.180.23 | SUCCESS | rc=0 >> 16:52:07 up 46 days, 1:34, 4 users, load average: 0.00, 0.01, 0.05 192.168.180.6 | SUCCESS | rc=0 >> 16:52:08 up 46 days, 1:34, 2 users, load average: 2.05, 2.01, 2.00
(5)定义组变量
变量也能够经过组名,而后应用到组内的全部成员。组变量的做用域是覆盖组全部成员,经过定义一个新块,块名由组名+":vars" 组成,定义格式以下:
[web1] Server6 Server5 [web1:vars] ntp=192.168.180.23 nginx=192.168.180.5 [root@Monitor ansible]# ansible web1 -m command -a 'uptime' Server5 | SUCCESS | rc=0 >> 10:26:01 up 23 min, 2 users, load average: 0.00, 0.00, 0.00 Server6 | SUCCESS | rc=0 >> 10:26:06 up 40 min, 2 users, load average: 0.00, 0.00, 0.00
####说明:上面的web1组中包含了两台主机Server5和Server6,经过对web1组指定了vars变量,相应的Server5和Server6主机至关于相应的指定了ntp和nginx变量的参数值。
(6)同时Ansible支持组嵌套组 ,经过定义一个新块,块名由组名+":children"组成,格式以下:
[hangzhou] host1 host2 [jiaxing] host2 host3 [zhejiang:children] hangzhou jiaxing [zhejiang:vars] some_server=foo.southeast.example.com halon_system_timeout=30 self_destruct_countdown=60 escape_pods=2 [china:children] zhejiang henan shandong hebei southeast
如上面的示例中,我指定了杭州组我有host一、hosts2;嘉兴组我有host三、host4主机;我又指定了一个组浙江组,同时包含杭州和嘉兴;同时为该组内的全部主机指定了四个vars变量。
分离主机与组特定数据
为了更好规范定义的主机与组变量,Ansible支持将/etc/ansible/hosts定义的主机名与组变量单独剥离出来存放到指定文件夹中.将采用YAML格式存放,存放位置规定: "/etc/ansible/group_vars/+组名" 和 "/etc/ansible/host_vars/+主机名" 分别存放指定组名或者主机名定义的变量。以下:
/etc/ansible/group_vars/dbservers
/etc/ansible/group_vars/webservers
定义的dbserver变量格式为:
[/etc/ansible/group_vars/dbservers]
---
ntp_server:acme.example.org
database_server:storage.example.org
(二)Patterns(主机与组正则匹配部分)
把Patterns 其实就是ansible中的规则去管理哪些主机,也能够理解为,要与哪台主机进行通讯。
如下ansible的用法:
ansible <pattern_goes_here> -m <module_name> -a <arguments> ansible <执行的客户机列表> -m <调用的模块> -a <执行的参数>
直接上一个示例:
ansible webservers -m service -a "name=httpd state=restarted"
这里是ansible对webservers 组内的主机来进行远程重启httpd服务 ,其中webservers 就是Pattern部分。而之因此上面说Pattern(模式)能够理解为正则,主要针对下面常常用到的用法而言的。
表示全部的主机可使用all 或 *
通配符和逻辑或
利用通配符还能够指定一组具备规则特征的主机或主机名,冒号表示or---逻辑或
*.baidu.com ##表示全部的以baidu.com结尾的 *.com ###表示全部的以.com结尾的主机 webservers1[0] #表示匹配 webservers1 组的第 1 个主机 webservers1[0:25] #表示匹配 webservers1 组的第 1 个到第 25 个主机(官网文档是":"表示范围,测试发现应该使用"-",注意不要和匹配多个主机组混淆)
webservers:dbservers #表示两个组中全部的主机。是或的关系
3.逻辑非!与逻辑and
!非的表达式,如,目标主机必须在组webservers但不在dbservers组中
webservers:!dbservers #####目标主机必须在webservers组中但不在dbservers组中
and的逻辑表达式:如,目标主机必须即在组webservers中又在组dbservers中
webservers:&dbservers ####目标主机必须既在webservers组中又在dbservers组中
更复杂的例子为:
webserver:dbservers:&nginx:!ntp ###在webservers或者dbservers组中,必须还存在于nginx组中,可是不在ntp组中。
4.混合高级用法
*.361way.com:*.org
还能够在开头的地方使用”~”,用来表示这是一个正则表达式:
~(web|db).*\.91it\.org
到这里估计你应该用能明白为何前面我会提到Patterns 能够理解为正则的缘由了。最后部分给两个ansible-playbook中具体可能用的用法:
a、在ansible-palybook命令中,你也可使用变量来组成这样的表达式,可是你必须使用“-e”的选项来指定这个表达式(一般咱们不这样用):
ansible-palybook -e webservers:!`excluded`:&`required`
b、在ansible和ansible-playbook中,还能够经过一个参数”–limit”来明确指定排除某些主机或组:
ansible-playbook site.yml --limit datacenter2
以上部分主要按照官方Pattern部分进行翻译和尝试。
(三)常见的用法命令:
1,表示通配inventory中的全部主机:all *
[root@Monitor ansible]# ansible all -m ping ###全部的客户端执行ping Server5 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.180.4 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.180.23 | SUCCESS => { "changed": false, "ping": "pong" } Server6 | SUCCESS => { "changed": false, "ping": "pong" }
2,指定具备规则特征的主机IP或主机名
[root@Monitor ansible]# ansible web1 -m ping ###全部web1组的主机执行ping Server6 | SUCCESS => { "changed": false, "ping": "pong" } Server5 | SUCCESS => { "changed": false, "ping": "pong" }
3,patterns能够分表表示一个或多个组,多组之间用冒号分开,意味着一个主机能够属于多个组
[root@Monitor ansible]# ansible web1:dbserver -m ping Server6 | SUCCESS => { "changed": false, "ping": "pong" } Server5 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.180.2 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.180.10 | SUCCESS => { "changed": false, "ping": "pong" }
4,排除特定的主机
ansible webservers:!dbservers -m ping #执行命令客户机必须属于webservers组,但不属于dbservers组。
5,执行交集主机
ansible webservers:&dbservers -m ping #执行命令客户机同时隶属于webservers组和dbservers组。
6,更复杂的条件
ansible webservers:database_server:&java_servers:!php_servers -m ping #执行命令客户机在webservers和database_server组中,也在java_servers卒中,可是不在php_servers组中。
7,能够不严格定义groups、当个host names、ips、都支持通配符
ansible *.example.com -m ping ansible *.com -m ping
8,同时支持通配和groups的混合使
ansible one*.com:dbservers
9,也能够匹配一个组的特定编号的主机
ansible webservers[0] -m ping #表示匹配webservers组的第一个主机 ansible webservers[-:25] -m ping #表示匹配webservers组的第一个到25个主机
10,在开头的地方使用“~”,表明这是一个正则表达式方式表示
~(web|db).*\.example\.com ansible ~(web|db).*\.example.com -m ping
11,在ansible和ansible-playbook中,还能够经过一个参数“--limit”来明确指定排除主机或组
ansible-playbook site.yml --limit database_server
12,从ansible1.2开始,若是想排除一个文件中的主机能够用“@“
ansible-playbook site.yml --limit @retry_hosts.txt