在Ansible动态广告资源

时间:2016-04-20 15:37:09

标签: ansible

我想我已经看到了某处的答案,但我现在似乎无法找到答案。我正在为我的EC2实例创建动态development广告资源文件。我想将标记为Stack=Development的所有实例分组。此外,我想专门识别开发API服务器。这些不仅包含Stack=Development标记,还包含API=Yes标记。

我的基本设置使用广告资源文件夹:

<root>/development
  ├── base
  ├── ec2.ini
  └── ec2.py

在我的base文件中,我希望有类似的内容:

[servers]
tag_Stack_Development

[apiservers]
tag_Stack_Development && tag_API_Yes

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

ansible -i development -u myuser apiservers -m ping

可以这样做吗?我知道语法是对的,但希望意图相当清楚?我无法想象我是唯一一个需要过滤多个标签的人,但是我还没有找到任何可以让我在我试图的地方找到的东西去吧。

3 个答案:

答案 0 :(得分:8)

这不是我头脑中的答案,但有时候我头脑中的东西会妨碍我。由于每个库存目录都有自己的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

答案 1 :(得分:3)

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

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

    ---
    - name: AWS Deploy
      hosts: tag_Environment_dev:&tag_Project_integration
      gather_facts: true

此过程会根据这两个标记过滤主机。

修改

实际上,您可以使用变量来使主机组规范动态化。像这样:

    ---
    - name: AWS Deploy
      hosts: "tag_Environment_{{env}}:&tag_Project_{{tag_project}}"
      sudo: true
      gather_facts: true

我在运行时使用来自ansible的变量文件和参数的{{env}}和{{tag_project}}变量。它成功地更改了剧本运行的主机。

答案 2 :(得分:2)

Ansible文档有a section on patterns。您可以在指定主机时执行标记交集,而不是创建新的部分:

[$] ansible -i development -u myuser tag_Stack_Development:&tag_API_Yes

这也适用于剧本。