Ansible——在动态清单中使用来自 Ec2 标签的条件

Ansible -- Using Conditionals from Ec2 Tags in Dynamic 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"
  ],

所以我现在想根据某些标签设置条件。 这是我要使用的剧本条件类型,仅当标签为 "stage":

时才添加用户
---
- 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

剧本执行失败。我收到以下错误:

error while evaluating conditional (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)

tag_env_prodtag_env_stage 是您示例中的组名。

您可以使用:

when: ('tag_env_stage' in group_names)

但这有点难看。我建议使用支持库存插件的现代 Ansible 版本(而不是传统的动态库存)。如果您的清单是使用 aws_ec2 插件生成的,您可以直接访问 tags 变量。所以你可以使用:

when: tags['env'] == 'stage'

设法让它使用以下语法。

when: hostvars[inventory_hostname].ec2_tag_env == "stage"

正如另一个答案所提到的,我试图使用 group_names 这实际上不是实例本身的标识符。 @Konstantin 的回答提供了如何处理 group_names 所以我需要使用动态清单中的 hostvars 对象。