Независимо от того, что я пытаюсь, по какой-то причине, когда я запускаю специальный модуль ansible, используя сценарий динамической инвентаризации ansible (ec2.py + ec2.ini), будет возвращаться только общественный IP-адреса для запросов тегов и попытки подключиться по SSH к общественный IP цели (ей). Например, если я бегу:
ansible -m ping tag_env_dev
Затем он пытается подключиться через общедоступный IP-адрес, хотя частный IP-адрес предпочтительнее (по соображениям безопасности, сложности и стоимости). Я попытался настроить следующие параметры в своем файле ec2.ini:
regions = us-east-1 # to restrict to us-east-1 region
destination_variable = public_dns_name # I've also tried private_dns_name and private_ip_address, all of which still attempt to connect to the public IP of the destination instance(s)
vpc_destination_variable = ip_address # also tried private_ip_address
Если я сбегу ./ec2.py --list --refresh-cache | grep -B 5 -A 5 "tag_env_dev"
, Я получаю результат с возвращенным только публичным IP:
"tag_env_dev": [
"{{public ip here}}"
],
После каждой последующей попытки я запускал ./ec2.py --list --refresh-cache
для очистки и восстановления кеша. Тогда я перезапущу ansible -m ping tag_env_dev
(или аналогичный), и я получу тайм-аут подключения по SSH к общедоступному IP-адресу экземпляра.
Я подтвердил, что могу подключиться по SSH к «общедоступному имени хоста» (которое разрешается в VPC на частный IP-адрес) и напрямую к частному IP-адресу, но не напрямую к общедоступному IP-адресу (как ожидалось). Так что это не ключевая проблема с авторизацией.
У меня также есть роль IAM, которой назначен этот сервер, с множеством разрешений для выполнения этих операций (например, у него есть только чтение для ec2 и vpc).
Дополнительная информация:
Я запускаю ansible из экземпляра ec2 в том же VPC, что и тестовая цель. И группа безопасности на цели настроена так, чтобы разрешить SSH из своего внутреннего диапазона блоков CIDR. Доступный хост также имеет роль IAM, которой достаточно для обнаружения частного IP-адреса цели.
Любая помощь будет принята с благодарностью.
Вот рабочий образец ec2.ini (протестирован с помощью ansible 2.1 и 2.3.1)
[ec2]
regions = us-east-1,us-west-2
regions_exclude =
destination_variable = private_ip_address
hostname_variable = peerio
vpc_destination_variable = private_ip_address
route53 = False
rds = False
elasticache = False
all_instances = False
#instance_states = pending, running, shutting-down, terminated, stopping, stopped
all_rds_instances = False
all_elasticache_replication_groups = False
all_elasticache_clusters = False
all_elasticache_nodes = False
cache_path = ~/.ansible/tmp
cache_max_age = 300
nested_groups = False
replace_dash_in_groups = True
expand_csv_tags = False
group_by_instance_id = True
group_by_region = True
group_by_availability_zone = True
group_by_ami_id = True
group_by_instance_type = True
group_by_key_pair = True
group_by_vpc_id = True
group_by_security_group = True
group_by_tag_keys = True
group_by_tag_none = True
group_by_route53_names = True
#pattern_include = staging-*
#pattern_exclude = staging-*
#instance_filters = instance-type=t1.micro,tag:env=staging
#only process items we tagged
instance_filters = tag:serviceclass=*
boto_profile = ansible
Затем экземпляры должны быть перечислены с использованием их частного IP-адреса в качестве идентификатора:
./ec2.py --list
{
"_meta": {
"hostvars": {
"10.255.100.138": {
"ansible_ssh_host": "10.255.100.138",
"ec2__in_monitoring_element": false,
"ec2_ami_launch_index": "0",
... "ec2_vpc_id": "vpc-57ed3733"
},
"10.255.100.142": {
"ansible_ssh_host": "10.255.100.142",
"ec2__in_monitoring_element": false,
...
В ec2.ini отредактируйте эту строку:
vpc_destination_variable = ip_address
К этому:
vpc_destination_variable = private_ip_address
Из ec2.ini:
# For server inside a VPC, using DNS names may not make sense. When an instance
# has 'subnet_id' set, this variable is used. If the subnet is public, setting
# this to 'ip_address' will return the public IP address. For instances in a
# private subnet, this should be set to 'private_ip_address', and Ansible must
# be run from within EC2. The key of an EC2 tag may optionally be used; however
# the boto instance variables hold precedence in the event of a collision.
# WARNING: - instances that are in the private vpc, _without_ public ip address
# will not be listed in the inventory until You set:
# vpc_destination_variable = private_ip_address
vpc_destination_variable = ip_address
https://github.com/ansible/ansible/blob/devel/contrib/inventory/ec2.ini