Ansible-在动态库存中使用Ec2标签中的条件

时间:2019-02-12 19:26:05

标签: amazon-ec2 ansible ansible-inventory

我正在使用ec2动态广告资源。

我所有的ec2实例都用其环境标记。例如tag:env = prodtag: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

2 个答案:

答案 0 :(得分:1)

tag_env_prodtag_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对象。

相关问题