如何正确限制Ansible Playbook仅在指定多组内的数据库主机执行?
问题描述
我要运行一个目标主机为databases组的database.yaml playbook,该组包含清单中所有db-*主机。
Playbook 代码
- name: Install PostgreSQL hosts: databases
清单文件内容
--- all: children: group1: children: subgroup1: hosts: db-host1: ansible_host: 192.168.0.1 cache-host2: ansible_host: 192.168.0.2 subgroup2: hosts: db-host3: ansible_host: 192.168.0.3 cache-host4: ansible_host: 192.168.0.4 group2: children: subgroup1: hosts: db-host5: ansible_host: 192.168.0.5 cache-host6: ansible_host: 192.168.0.6 subgroup2: hosts: db-host7: ansible_host: 192.168.0.7 cache-host8: ansible_host: 192.168.0.8 databases: hosts: db-host1: db-host3: db-host5: db-host7: cache: hosts: cache-host2: cache-host4: cache-host6: cache-host8:
我需要仅在属于group1的subgroup1组内的主机上执行,且不能绑定具体主机名(因为subgroup1中的db-*主机数量可能较多)。我尝试用以下命令指定限制条件:
ansible-playbook -i inventory/demo database.yml --limit "group1,subgroup1"
但playbook仍会在所有databases组的主机上执行,请问如何正确实现多组限制执行?
解决方案
你之前用的--limit "group1,subgroup1"是取两个组的并集,所以会包含所有在group1或subgroup1里的主机,再加上playbook本身的databases组,实际是取这两个范围的并集,导致所有databases主机都被选中。要实现同时属于多个组的主机筛选,需要用Ansible的组交集语法:
方法1:用&符号指定组交集
在--limit参数里用&来表示“同时属于多个组”,你需要筛选的是既在databases组,又在group1的subgroup1组的主机,所以命令应该写成:
ansible-playbook -i inventory/demo database.yml --limit "databases:&group1&subgroup1"
解释:databases:&group1&subgroup1表示只选择同时属于这三个组的主机,这样就会精准定位到group1/subgroup1下的db-*主机。
方法2:直接修改Playbook的hosts字段
如果不需要临时限制,也可以直接修改playbook的hosts字段,用交集语法:
- name: Install PostgreSQL hosts: databases:&group1&subgroup1
这样运行playbook时不需要加--limit,直接执行即可:
ansible-playbook -i inventory/demo database.yml
方法3:用模式匹配筛选主机
如果你的subgroup1下的db主机都是db-*命名,也可以结合组和模式匹配:
ansible-playbook -i inventory/demo database.yml --limit "group1:subgroup1:&db-*"
不过这种方式依赖主机命名规则,不如组交集稳定。
内容的提问来源于stack exchange,提问作者Vasai
相关产品推荐
相关产品推荐

