: :其他软件 2020-09-07 20:49:34
一、通配模式patterns介绍
在ansible中 patterns是指确定ansible管理主机和如何运行命令管理ansible客户机。
可以看官网文档的 Patterns: targeting hosts and groups ,也可以看 ansible权威指南的 Patterns
1.1 用法
命令用法:
ansible
ansible <执行的客户机列表> -m <调用的模块> -a <执行的参数>
1.2 通配符号支持
ansible支持主机列表符号如下:
全量: all/*
逻辑或: :
逻辑非: !
逻辑与: &
切片: []
正则匹配: 以~开头
#2.指定主机名
为了方便绑定hosts,所有机子(vm82、vm821、vm76)都做一下host绑定
#3台机子都做hosts绑定,都执行下面命令
echo "192.168.3.82 vm82">>/etc/hosts
echo "192.168.3.21 vm821">>/etc/hosts
echo "192.168.3.76 vm76">>/etc/hosts
#测试是否能ping通
ping -c 3 vm82
ping -c 3 vm821
ping -c 3 vm76
#分组的主机,请在任何组头之前指定。
#第一行插入上面的主机名
cd /etc/ansible/
sed -i '1ivm82nvm821nvm76' hosts
PS:如果觉得上面这样做麻烦,如果机子多的话,其实可以在内部建立一个内部DNS进行解析的
#分组的主机,请在任何组头之前指定。
[root@vm82 ansible]# head -3 hosts
vm82
vm821
vm76
#为以为,直接以主机名执行
[root@vm82 ansible]# ansible vm821 -a 'ip addr show ens34'
vm821 | CHANGED | rc=0 >>
3: ens34:
link/ether 00:0c:29:b7:b1:c6 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.21/24 brd 192.168.3.255 scope global noprefixroute ens34
valid_lft forever preferred_lft forever
inet6 fe80::b253:8225:92cb:c810/64 scope link dadfailed tentative noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::a557:999e:f395:cbae/64 scope link noprefixroute
valid_lft forever preferred_lft forever
上面测试之后把前三个都删除了,方便后面测试
#删除刚才写入的前3行
sed -i '1,3d' hosts
#3.指定组名
[root@vm82 ansible]# ansible hua -a "hostname"
192.168.3.21 | CHANGED | rc=0 >>
vm821
#4.匹配所有的主机:all 或 *
[root@vm82 ansible]# ansible all -a "hostname"
192.168.3.76 | CHANGED | rc=0 >>
vm76
192.168.3.21 | CHANGED | rc=0 >>
vm821
#5.匹配具有规则特性的主机或主机名
[root@vm82 ansible]# ansible hu* -a "hostname"
192.168.3.21 | CHANGED | rc=0 >>
vm821
#6.匹配多个组的主机,中间用 : 隔开(或操作)
#所有属于组hua或属于h1的机器
[root@vm82 ansible]# ansible hua:h1 -a "hostname"
192.168.3.76 | CHANGED | rc=0 >>
vm76
192.168.3.21 | CHANGED | rc=0 >>
vm821
#7.在某个组而不在其他组(非操作)
#修改一下hosts,如下:
[root@vm82 ansible]# tail -6 hosts
[hua]
192.168.3.21
192.168.3.76
[h1]
192.168.3.76
#查找属性hua组但不属性h1组
[root@vm82 ansible]# ansible 'hua:!h1' -a "hostname"
192.168.3.21 | CHANGED | rc=0 >>
vm821
#8.匹配两个组的交集(与操作)
[root@vm82 ansible]# tail -6 hosts
[hua]
192.168.3.21
192.168.3.76
[h1]
192.168.3.76
[root@vm82 ansible]# ansible 'hua:!h1' -a "hostname"
192.168.3.21 | CHANGED | rc=0 >>
vm821
[root@vm82 ansible]# ansible 'hua:&h1' -a "hostname"
192.168.3.76 | CHANGED | rc=0 >>
vm76
#9.匹配一个组的特定主机
#要找hua组,第1-2台主机,注意下标是从0开始的
[root@vm82 ansible]# tail -6 hosts
[hua]
192.168.3.21
192.168.3.76
[h1]
192.168.3.76
[root@vm82 ansible]#
[root@vm82 ansible]# ansible hua[0:1] -a "hostname"
192.168.3.76 | CHANGED | rc=0 >>
vm76
192.168.3.21 | CHANGED | rc=0 >>
vm821
#10. 混合匹配
我这里开多一台机子vm822,ip地址为192.168.3.22,并执行 命令把公钥复制过去
#复制ansible的公钥
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.3.22
#我这里添加了多一个主机组
[root@vm82 ansible]# tail -9 hosts
192.168.3.21
192.168.3.76
[h1]
192.168.3.76
[t1]
192.168.3.22
[root@vm82 ansible]#
[root@vm82 ansible]# ansible 't1:hua:!h1' -a "hostname"
192.168.3.22 | CHANGED | rc=0 >>
vm822
192.168.3.21 | CHANGED | rc=0 >>
vm821
#11.正则表达式~
这里的正则表达式使用的是python,可以去pyton官方文档查看python的正则表达式,也可以看一下下表:
例子:
查找以21、22、23、24、25这些结尾的机子数有多少台,可以执行如下命令
#在正则表达式中, .* 表示所有,[1-5]表示多1至5
[root@vm82 ansible]# ansible '~.*2[1-5]' -a 'hostname'
192.168.3.21 | CHANGED | rc=0 >>
vm821
192.168.3.22 | CHANGED | rc=0 >>
vm822
#12. --limit
同时让我们提前了解一些技能,除了如上,你也可以通过 --limit 标记来添加排除条件,/usr/bin/ansible or /usr/bin/ansible-playbook都支持:
#此命令学到后面你们自己弄,这里不做演示
ansible-playbook site.yml --limit datacenter2
#13. @为前缀从文件读取hosts
如果你想从文件读取hosts,文件名以@为前缀即可.从Ansible 1.2开始支持该功能:
#此命令学到后面你们自己弄,这里不作演示
ansible-playbook site.yml --limit @retry_hosts.txt