1. 基本概念
在 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
。
2. 使用方式
比如你想在所有需要运行 node exporter 的机器上执行任务,就可以写:
ansible -i inventory.ini prometheus-node-exporter -m ping
这样 webservers
和 dbservers
都会被覆盖到。
3. 更复杂的组合
Ansible 支持三种“组关系”:
children(子组)
[biggroup:children] group1 group2
→
biggroup
=group1
+group2
。vars(组变量)
给组统一设置变量,比如默认 SSH 用户:[webservers:vars] ansible_user=ubuntu ansible_port=2222
嵌套组合
组里套组,最后形成一棵树。
4. 命令行的“多组” VS :children
不要混淆:
- 命令行里写
"webservers:dbservers"
→ 是临时组合,运行时选择两个组的并集。 [biggroup:children]
→ 是永久定义,写在 inventory 文件里,之后 Playbook 或命令里直接用biggroup
就能选到。
5. 实际应用场景
比如你有 100 台机器:
- 30 台是 web
- 20 台是 db
- 50 台是 cache
你可以定义:
[allservers:children]
webservers
dbservers
cacheservers
这样 Playbook 里只要写:
- hosts: allservers
tasks:
- name: 安装 node exporter
apt:
name: prometheus-node-exporter
state: present
一次性就覆盖所有机器。