Ansible возвращает неправильные хосты в динамическом инвентаре (коллизия приватных ip?)

У меня есть два экземпляра на разных VPC, которые имеют один и тот же частный адрес.

С I-VPC:

172.18.50.180:
    tags:
        Environment: ci
        Role: aRole

тест-VPC:

172.18.50.180:
    tags:
        Environment: test
        Role: web

Я использую следующую пьесу:

- name: "print account specific variables"
  hosts: "tag_Environment_ci:&tag_Role_web"
  tasks:
    - name: "print account specific variables for account {{ account }}"
      debug:
        msg:
          - 'ec2_tag_Name': "{{ ec2_tag_Name }}"
            'ec2_tag_Role': "{{ ec2_tag_Role }}"
            'ec2_private_ip_address': "{{ ec2_private_ip_address }}"
            'ec2_tag_Environment': "{{ ec2_tag_Environment }}"

Поскольку я спрашиваю и о ролевой сети, и о среде ci, ни один из этих примеров не должен быть выбран, но, тем не менее, результат, который я получаю, таков:

ok: [172.18.50.180] => {
  "changed": false,
  "msg": [
      {
          "ec2_private_ip_address": "172.18.50.180",
          "ec2_tag_Environment": "test",
          "ec2_tag_Name": "test-web-1",
          "ec2_tag_Role": "web"
      }
  ]
}

Очевидно, этот экземпляр не соответствует требованиям hosts...

Это похоже на ec2.py искал Environment tag, нашел ci для 172.18.50.180, затем поискал отдельно для роли ролей, нашел другой под 172.18.50.180 и просто пометил этот экземпляр как нормально, хотя это два разных экземпляра на разных vpcs.

Я пытался изменить vpc_destination_variable в ec2.ini в id но тогда я получаю сообщение об ошибке, когда Ansible пытается подключиться к этим экземплярам, ​​потому что он не может подключиться к идентификатору...

fatal: [i-XXX]: UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname i-XXX: Name or service not known\r\n", "unreachable": true
}

Есть ли другой вариант, который будет работать под vpc_destination_variable? Любое известное решение для такого столкновения?

1 ответ

Решение

tl; dr: это именно то, что hostname_variable в ec2.ini для, как задокументировано:

# This allows you to override the inventory_name with an ec2 variable, instead
# of using the destination_variable above. Addressing (aka ansible_ssh_host)
# will still use destination_variable. Tags should be written as 'tag_TAGNAME'.

К сожалению, я пропустил это и нашел его после осмотра в ec2.py

Более длинный ответ с дополнительными опциями для имен хостов

Узнав о hostname_variableУ меня была другая проблема, что он может получить только одну переменную. В моем случае у меня было несколько экземпляров с одним и тем же частным ip с одной стороны, а некоторые с одинаковыми тегами с другой (группы автоматического масштабирования AWS, одинаковые теги на всех хостах), поэтому мне нужен был способ различать их.

Я создал суть с этой опцией. Мое изменение в строке 848. Это позволяет использовать несколько переменных, разделенных запятыми, в hostname_variableНапример:

hostname_variable = tag_Name,private_ip_address
Другие вопросы по тегам