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