Ansible Inventory:如何从不在某些其他组中的主机构建组

Ansible Inventory: how to build a group from hosts not in certain other groups

我正在寻找一种方法来构建清单组,其中包括所有尚未放入另一个组的主机。

在我的例子中,这些组确定何时应更新特定服务器 - 星期一、星期三、星期五或“任何一天,这无关紧要”。我不想明确枚举主机,因为这是手动工作且容易出错。

all:
  hosts:
    host1[1-100].example.com:
  children:
    updateMonday:
      hosts:
        host1.example.com:
        host4.example.com:
    updateWednesday:
      hosts:
        host2.example.com:
        host5.example.com:
    updateFriday:
      hosts:
        host3.example.com:
        host6.example.com:
    updateAnyday:
      children:
        # This expresses what I want but does not work
        !updateMonday:
        !updateWednesday:
        !updateFriday:

我正在使用此示例中未显示的其他组,因此我不能简单地使用“未分组”组来执行我想要的操作。

编辑:我不想修改我使用的剧本,因为我有很多剧本,而且我还需要临时命令来支持新组。

创建一个包含所有主机的组,例如全部更新

all:
  hosts:
    host[1-100].example.com:
  children:
    updateAll:
      hosts:
        host[1-100].example.com:
    updateMonday:
      hosts:
        host1.example.com:
        host4.example.com:
  ...

在第一个游戏中动态创建组 updateAnyday 并在第二个游戏中使用它

- hosts: all
  tasks:
    - add_host:
        name: "{{ item }}"
        groups: updateAnyday
      loop: "{{ groups.updateAll|
                difference(groups.updateMonday)|
                difference(groups.updateWednesday)|
                difference(groups.updateFriday) }}"
      run_once: true

- hosts: updateAnyday
  tasks:
  ...

(未测试)


问:"不想修改剧本"

A:使用主机列表创建文件 updateAnyday.txt,例如使用上面的剧本。然后 运行 你的剧本 updateAnyday.yml 库存有限,例如

shell> ansible-playbook updateAnyday.yml --limit @updateAnyday.txt

参见 Patterns and ansible-playbook flags

组队组合可以自创戏,换主持人。例如,除 updateMonday、updateWednesday 和 updateFriday 之外的所有主机将是:

hosts: all:!updateMonday:!updateWednesday:!updateFriday

您还可以使用 add_hostgroup_by 命令动态创建组。