Ansible - Использование условных выражений из тегов Ec2 в динамическом инвентаре - PullRequest
0 голосов
/ 12 февраля 2019

Я использую динамический инвентарь 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"
  ],

Итак, теперь я хочу установить условияна основе определенных тегов. Вот тип условных обозначений playbook, который я хочу использовать, добавляя пользователей только в том случае, если тег «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

Воспроизведение не выполняется.Я получаю ошибки в виде:

ошибка при оценке условного (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 голосов
/ 13 февраля 2019

удалось заставить его работать со следующим синтаксисом.

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

Как уже упоминалось в другом ответе, я пытался использовать group_names, которые на самом деле не являются идентификаторами самих экземпляров.@ В ответе Константина рассказывается, как обращаться с group_names, поэтому мне нужно было использовать hostvars объект из динамического инвентаря.

0 голосов
/ 12 февраля 2019

tag_env_prod, tag_env_stage - это имена групп в вашем примере.

Вы можете использовать:

when: ('tag_env_stage' in group_names)

Но это немного уродливо.Я бы рекомендовал использовать современную версию Ansible с поддержкой плагинов инвентаря (вместо устаревших динамических инвентаризаций).Если ваш инвентарь генерируется с помощью плагина aws_ec2, у вас есть прямой доступ к переменной tags.И поэтому вы можете использовать:

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