在 Ansible 的 inventory 里,主机是可以分组的,而组又可以包含其它组。
[webservers]
192.168.1.10
192.168.1.11
[dbservers]
192.168.1.20
[prometheus-node-exporter:children]
webservers
dbservers
解释:
webservers
和 dbservers
是普通的组,里面直接写主机。[prometheus-node-exporter:children]
说明这是一个 父组,它的成员不是主机,而是其它组。最终效果:
prometheus-node-exporter
组里 = webservers
+ dbservers
的所有主机。192.168.1.10, 192.168.1.11, 192.168.1.20
。比如你想在所有需要运行 node exporter 的机器上执行任务,就可以写:
ansible -i inventory.ini prometheus-node-exporter -m ping
这样 webservers
和 dbservers
都会被覆盖到。
Ansible 支持三种“组关系”:
children(子组)
[biggroup:children]
group1
group2
→ biggroup
= group1
+ group2
。
vars(组变量)
给组统一设置变量,比如默认 SSH 用户:
[webservers:vars]
ansible_user=ubuntu
ansible_port=2222
嵌套组合
组里套组,最后形成一棵树。
:children
不要混淆:
"webservers:dbservers"
→ 是临时组合,运行时选择两个组的并集。[biggroup:children]
→ 是永久定义,写在 inventory 文件里,之后 Playbook 或命令里直接用 biggroup
就能选到。比如你有 100 台机器:
你可以定义:
[allservers:children]
webservers
dbservers
cacheservers
这样 Playbook 里只要写:
- hosts: allservers
tasks:
- name: 安装 node exporter
apt:
name: prometheus-node-exporter
state: present
一次性就覆盖所有机器。