过滤Ansible动态库存中的多个标签

Rob*_*son 10 ansible

我想我已经在某个地方找到了答案,但我现在似乎无法找到它.我正在development为我的EC2实例创建动态库存文件.我想将标记为的所有实例分组Stack=Development.此外,我想具体确定开发API服务器.那些不仅有Stack=Development标签,还有API=Yes标签.

我的基本设置使用库存文件夹:

<root>/development
  ??? base
  ??? ec2.ini
  ??? ec2.py
Run Code Online (Sandbox Code Playgroud)

在我的base文件中,我想要这样的东西:

[servers]
tag_Stack_Development

[apiservers]
tag_Stack_Development && tag_API_Yes
Run Code Online (Sandbox Code Playgroud)

然后我就可以运行它来ping我的所有开发api服务器:

ansible -i development -u myuser apiservers -m ping
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?我知道语法不对,但希望意图相当清楚?我无法想象我是唯一一个需要过滤多个标签的人,但是我无法找到任何让我想到的地方.

Rob*_*son 9

这不是我头脑中的答案,但有时我头脑中的东西会妨碍我.由于每个库存目录都有自己的库存目录ec2.ini,我只需在那里过滤堆栈,然后在该过滤器中进行分组.

# <root>/development/ec2.ini
...
instance_filters = tag:Stack=Development

# <root>/development/base
[tag_Role_webserver]
[tag_API_Yes]

[webservers:children]
tag_Role_webserver

[apiservers:children]
tag_API_Yes
Run Code Online (Sandbox Code Playgroud)


Jam*_*gan 6

xiong-chiamiov 提供的答案确实有效。我刚刚在我的 ansible 部署中使用它。

所以我有一个使用动态清单脚本的剧本。用这段代码:

    ---
    - name: AWS Deploy
      hosts: tag_Environment_dev:&tag_Project_integration
      gather_facts: true
Run Code Online (Sandbox Code Playgroud)

该过程确实通过这两个标签过滤主机。

编辑

实际上对此进行扩展,您还可以使用变量使主机组规范动态化。像这样:

    ---
    - name: AWS Deploy
      hosts: "tag_Environment_{{env}}:&tag_Project_{{tag_project}}"
      sudo: true
      gather_facts: true
Run Code Online (Sandbox Code Playgroud)

我使用变量文件中的 {{env}} 和 {{tag_project}} 变量以及在运行时提供给 ansible 的参数。它成功地更改了剧本所针对的主机。