ansible 可以使用多种 host patterns 来指定远程主机,用在如下两个地方:

  • 命令行 ansible [host patterns] -m module -a arguments
  • playbook 中通过- hosts: [host patterns]来指定要执行该 play 的远程主机

Ansible技术问答:http://linux.xyz/topic/Ansible

先在 hosts 文件定义几个主机:

s12 ansible_ssh_host=192.168.0.12
s13 ansible_ssh_host=192.168.0.13
s14 ansible_ssh_host=192.168.0.14

1、all 匹配所有组的主机

ansible all -m ping // 等同于 ansible '*' -m ping

2、匹配单个主机或组

在 hosts 文件中添加一个组:

[ceshi1]
s12
s13

执行命令:

$ ansible s12 -m ping #只匹配 12 这台主机
s12 | success >> {
 "changed": false,
 "ping": "pong"
}

$ ansible ceshi1 -m ping #匹配 test1 组内的所有主机
s12 | success >> {
 "changed": false,
 "ping": "pong"
}
s13 | success >> {
 "changed": false,
 "ping": "pong"
}

3、:表示匹配多个主机或组

在 hosts 文件中配置两个组:

[ceshi1]
s12
s13

[ceshi2]
s13
s14

执行命令:

$ ansible "ceshi1:ceshi2" -m ping #同时属于多个组的主机只会执行一次
s14 | success >> {
 "changed": false,
 "ping": "pong"
}
s12 | success >> {
 "changed": false,
 "ping": "pong"
}
s13 | success >> {
 "changed": false,
 "ping": "pong"
}

4、! 表示排除一个主机组或组

在 hosts 文件中配置两个组:

[ceshi1]
s12
s13
s14

[ceshi2]
s13

执行命令:

$ ansible 'ceshi1:!ceshi2' -m ping #匹配所有在 test1 组却不在 test2 组中的主机
s14 | success >> {
 "changed": false,
 "ping": "pong"
}
s12 | success >> {
 "changed": false,
 "ping": "pong"
}

5、& 表示多个组的交集

在 hosts 文件配置两个组:

[ceshi1]
s12
s13

[ceshi2]
s13
s14

执行命令:

$ ansible "ceshi1:&ceshi2" -m ping #匹配同时在 test1 和 test2 组中的主机
s13 | success >> {
 "changed": false,
 "ping": "pong"
}

一个复杂的匹配:

webservers:dbservers:&staging:!phoenix

首先取出属于 webservers 组和 dbservers 组的所有主机,取出这些主机中同时也属于staging 组的那部分,然后再去掉不属于 phoenix 组的那些

6、?通配符

$ ansible 's1?' -m ping #匹配"s1"开头再一个任意字符的主机或组
s12 | success >> {
 "changed": false,
 "ping": "pong"
}
s13 | success >> {
 "changed": false,
 "ping": "pong"
}
s14 | success >> {
 "changed": false,
 "ping": "pong"
}

7、~ 表示使用正则表达式

在 hosts 文件配置两个组

[ceshi1]
s12
s13

[ceshi2]
s13
s14

执行命令:

$ ansible '~cehsi.*' -m ping #这里匹配到了 ceshi1 和 ceshi2 组
s12 | success >> {
 "changed": false,
 "ping": "pong"
}
s14 | success >> {
 "changed": false,
 "ping": "pong"
}
s13 | success >> {
 "changed": false,
 "ping": "pong"
}

同时要注意,ansible 和 ansible-playbook 命令还提供了-l,--limit 参数,对上面匹配出的结果会再进行一次过滤:

$ ansible 's12:s14:s146' -m ping -l 's14*'
s146 | success >> {
 "changed": false,
 "ping": "pong"
}
s14 | success >> {
 "changed": false,
 "ping": "pong"
}