我正在使用ec2动态广告资源。
我所有的ec2实例都用其环境标记。例如tag:env = prod
或tag:env = test
因此我的动态广告资源已正确设置了变量。...
"ec2": [
"ip_10_1_1_1_ec2_internal",
"ip_10_1_1_2_ec2_internal",
"ip_10_1_1_3_ec2_internal",
"ip_10_1_1_4_ec2_internal",
"ip_10_1_1_5_ec2_internal",
"ip_10_1_1_6_ec2_internal",
"ip_10_1_1_7_ec2_internal"
],
...
"tag_env_mgmt": [
"ip_10_1_1_7_ec2_internal",
"ip_10_1_1_6_c2_internal",
"ip_10_1_1_5_ec2_internal"
],
"tag_env_prod": [
"ip_10_1_1_2_ec2_internal",
"ip_10_1_1_1_ec2_internal"
],
"tag_env_stage": [
"ip_10_1_1_3_ec2_internal",
"ip_10_1_1_4_ec2_internal"
],
所以我现在想基于某些标签设置条件。 这是我要使用的剧本条件类型,仅当标签为“舞台”时才添加用户:
---
- hosts: ec2
vars:
users:
- user1
- user2
tasks:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env_stage is defined
也这样尝试过:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env_stage
这:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env == stage
戏剧无法执行。我在以下方面遇到错误:
评估条件(tag_env_stage)时出错:
我检查了文档,但没有发现任何东西残留在我身上。
(https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html)
(https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html)
答案 0 :(得分:1)
tag_env_prod
,tag_env_stage
是您示例中的组名。
您可以使用:
when: ('tag_env_stage' in group_names)
但这有点难看。我建议使用支持库存插件(而不是旧版动态库存)的现代Ansible版本。如果您的广告资源是使用aws_ec2
插件生成的,则可以直接访问tags
变量。因此,您可以使用:
when: tags['env'] == 'stage'
答案 1 :(得分:0)
设法使它使用以下语法。
when: hostvars[inventory_hostname].ec2_tag_env == "stage"
正如提到的其他答案一样,我试图使用group_names
,它们实际上不是实例本身的标识符。 @Konstantin的答案提供了如何处理group_names
的方法,因此我需要使用动态清单中的hostvars
对象。