hualinux 进阶 2-1.2:ansible通配模式patterns

目录

一、通配模式patterns介绍

1.1 用法

1.2 通配符号支持

二、例子

#1.指定某个主机IP

#2.指定主机名

#3.指定组名

#4.匹配所有的主机:all 或 *

#5.匹配具有规则特性的主机或主机名

#6.匹配多个组的主机,中间用 : 隔开(或操作)

#7.在某个组而不在其他组(非操作)

#8.匹配两个组的交集(与操作)

#9.匹配一个组的特定主机

#10. 混合匹配

#11.正则表达式~

#12. --limit

#13. @为前缀从文件读取hosts


ansible主机或主机组,还支持通配模式,还有正则表达式,这样可以让ansible查到主机或主机组更加灵活。

一、通配模式patterns介绍

在ansible中 patterns是指确定ansible管理主机和如何运行命令管理ansible客户机。

可以看官网文档的  Patterns: targeting hosts and groups ,也可以看 ansible权威指南的  Patterns

1.1 用法

命令用法:

ansible <pattern_goes_here> -m <module_name> -a <arguments>
ansible <执行的客户机列表>  -m <调用的模块>  -a <执行的参数>

1.2 通配符号支持

ansible支持主机列表符号如下:

  • 全量all/*
  • 逻辑或:
  • 逻辑非
  • 逻辑与
  • 切片: []
  • 正则匹配: ~开头

 

二、例子

#1.指定某个主机IP

[root@vm82 ~]# ansible 192.168.3.21 -a "hostname"
192.168.3.21 | CHANGED | rc=0 >>
vm821

#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 '1i\vm82\nvm821\nvm76' 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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值