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

Ansible Inventory:如何从不在某些其他组中的主机构建组,ansible,ansible-inventory,Ansible,Ansible Inventory,我正在寻找一种方法来构建一个清单组,其中包括所有尚未放入另一个组的主机 在我的例子中,这些小组确定某个特定服务器应该在什么时候更新——要么在周一、周三、周五,要么“任何一天都不重要”。我不想显式地枚举主机,因为这是手动工作,而且容易出错 all: hosts: host1[1-100].example.com: children: updateMonday: hosts: host1.example.com: host4.exa

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

在我的例子中,这些小组确定某个特定服务器应该在什么时候更新——要么在周一、周三、周五,要么“任何一天都不重要”。我不想显式地枚举主机,因为这是手动工作,而且容易出错

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:
我使用的是本例中未显示的其他组,因此我不能简单地使用“未分组”组来做我想做的事情


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

创建一个包含所有主机的组,例如updateAll

全部:
主持人:
主机[1-100]。example.com:
儿童:
更新所有:
主持人:
主机[1-100]。example.com:
更新日期:
主持人:
host1.example.com:
host4.example.com:
...
在第一个剧本中,动态创建组updateAnyday,并在第二个剧本中使用它

-主机:所有
任务:
-添加\u主机:
名称:“{{item}}”
组:updateAnyday
循环:“{{groups.updateAll”|
差异(groups.updateMonday)|
差异(groups.updatewdnesday)|
差异(groups.updateFriday)}”
跑一次:对
-主持人:updateAnyday
任务:
...
(未测试)


问:“我不想修改剧本。”

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

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

请参阅。

您可以创建一个播放并使用组组合更改主机。例如,除updateMonday、UpdateWebnesday和updateFriday之外的所有主机都是:

主机:全部:!updateMonday:!UpdateWebNesday:!更新速度

您还可以使用
add\u host
group\u by
命令动态创建组。

有趣的想法,谢谢!我忘了在问题中提到我不想修改剧本。但答案本身很好,不客气!下一个选项可能是创建一个包含有限主机列表的文件。我并没有意识到——limit可以接受一个文件。这实际上也可以解决我的其他几个问题!对于那些可能通过Google找到这一点的人:在尝试了一点之后,我发现了第一种方法的一个局限性:因为组是动态创建的,所以我不能用--limit命令行选项指定它。显然,它也不适用于特殊命令。当然,第二个版本应该解决这两个问题。