在 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
一次性就覆盖所有机器。