ansible清单通过组嵌套(children)实现逻辑多级继承,子组自动继承父组主机与变量,按“主机>子组>父组>all”优先级覆盖变量,禁止循环引用和同名混用。

Ansible 清单本身不支持传统编程意义上的“多级继承”(如类继承),但可通过 组的嵌套(children)机制 实现逻辑上的层级继承关系,即子组自动继承父组的主机、变量和配置。这是 Ansible 原生支持且最常用的方式。
用 [groupname:children] 定义嵌套组
在 INI 格式清单中,使用 :children 后缀声明一个组为“父组”,其下可列出多个子组名。这些子组中的所有主机将被自动纳入该父组范围。
例如:
[web_servers][db_servers]
[cache_servers]
[production:children]
web_servers
db_servers
[us_east:children]
web_servers
cache_servers
[all_environments:children]
production
us_east
此时:
-
ansible production -m ping会同时对web_servers和db_servers中的所有主机执行 -
ansible all_environments -m ping会覆盖production和us_east,进而递归包含 web、db、cache 三类主机
变量继承:子组可覆盖父组变量
Ansible 按照“组变量作用域”优先级生效:主机变量 > 子组变量 > 父组变量 > all 组变量。因此可在父组定义通用变量,在子组中针对性覆盖。
例如,在 /etc/ansible/group_vars/production 中写:
deploy_user: deployer
在 /etc/ansible/group_vars/us_east 中写:
deploy_user: east_deployer # 覆盖父组值
那么 us_east 下的主机将使用 east_deployer,而 production 中其他子组(如 db_servers)仍沿用 deployer。
避免循环引用与隐式歧义
Ansible 不允许组直接或间接地包含自身,否则运行时会报错 Inventory error: group X has a circular dependency。检查方式:
- 不要让
A:children包含B,同时又让B:children包含A - 避免用同名普通组与
:children组混用(如既有[web]又有[web:children]),这会导致行为不可预测 - 用
ansible --list-hosts <group></group>验证实际解析结果,例如:ansible all_environments --list-hosts
进阶:结合 group_vars 目录实现分层变量管理
推荐按层级组织 group_vars/ 目录结构,例如:
├── all
├── production
├── us_east
└── eu_west
其中 all 定义全局默认值(如 ansible_user: ansible),其余按需覆盖。这种结构天然适配嵌套组的变量查找顺序,无需额外配置。











