Ansible中使用--limit指定组内特定主机失效问题排查
我希望Ansible在特定组的特定主机上运行playbook,我的inventory配置如下:
[a] 10.10.10.10 11.11.11.11 dog.local.lab [b] 10.10.10.11 cat.local.lab moose.local.lab [c] 10.10.10.12 wolf.local.lab
执行的playbook运行命令:
ansible-playbook -i ./inventory.ini --limit a:10.10.10.10,a:11.11.11.11,b:10.10.10.11,b:moose.local.lab,c:wolf.local.lab -e foo=test -e bar=test2 ./mypbook.yaml
但Ansible返回以下警告和错误:
[WARNING]: Could not match supplied host pattern, ignoring: a:10.10.10.10
[WARNING]: Could not match supplied host pattern, ignoring: a:11.11.11.11
[WARNING]: Could not match supplied host pattern, ignoring: b:10.10.10.11
[WARNING]: Could not match supplied host pattern, ignoring: b:moose.local.lab
[WARNING]: Could not match supplied host pattern, ignoring: c:wolf.local.lab
ERROR! Specified inventory, host pattern and/or --limit leaves us with no hosts to target.
请问这是为什么?我是否错误使用了--limit参数?
你确实用错了--limit的语法:
- Ansible里
组名:主机名是排除匹配,意思是从该组里移除指定主机,而非选中组内的这个主机。你当前的写法相当于把所有目标主机都从对应组里排除了,最后自然没有可执行的主机,触发报错。
要实现“选中特定组内的特定主机”,有两种正确写法:
- 直接列主机:因为你的主机在inventory里都是唯一的,直接把所有目标主机用逗号分隔即可:
ansible-playbook -i ./inventory.ini --limit 10.10.10.10,11.11.11.11,10.10.10.11,moose.local.lab,wolf.local.lab -e foo=test -e bar=test2 ./mypbook.yaml
- 交集语法:如果要明确限定“某组内的某主机”,用
&表示交集,格式为组名:&主机名,多个目标用逗号分隔:
ansible-playbook -i ./inventory.ini --limit a:&10.10.10.10,a:&11.11.11.11,b:&10.10.10.11,b:&moose.local.lab,c:&wolf.local.lab -e foo=test -e bar=test2 ./mypbook.yaml
补充:如果要选中整个组,直接写组名即可;要是想排除组内部分主机,才用组名:主机名的格式,比如a:dog.local.lab表示选中a组里除了dog.local.lab之外的所有主机。
内容的提问来源于stack exchange,提问作者Dave

