返回到文章

采纳

编辑于 3天前

Ansible组嵌套

Ansible

1. 基本概念

在 Ansible 的 inventory 里,主机是可以分组的,而组又可以包含其它组。

例子

[webservers]
192.168.1.10
192.168.1.11

[dbservers]
192.168.1.20

[prometheus-node-exporter:children]
webservers
dbservers

解释:

  • webserversdbservers 是普通的组,里面直接写主机。
  • [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

这样 webserversdbservers 都会被覆盖到。

3. 更复杂的组合

Ansible 支持三种“组关系”:

  1. children(子组)

    [biggroup:children]
    group1
    group2
    

    biggroup = group1 + group2

  2. vars(组变量)
    给组统一设置变量,比如默认 SSH 用户:

    [webservers:vars]
    ansible_user=ubuntu
    ansible_port=2222
    
  3. 嵌套组合
    组里套组,最后形成一棵树。

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

一次性就覆盖所有机器。