我想我已经看到了某处的答案,但我现在似乎无法找到答案。我正在为我的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
可以这样做吗?我知道语法是对的,但希望意图相当清楚?我无法想象我是唯一一个需要过滤多个标签的人,但是我还没有找到任何可以让我在我试图的地方找到的东西去吧。
答案 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
这也适用于剧本。