Como retornar IP privado de um inventário dinâmico ansible na AWS?

4

Não importa o que eu tente, por algum motivo, quando executo um módulo ad-hoc ansible usando o script ansible dynamic inventory (ec2.py + ec2.ini) só retornarei public IPs para Marcar consultas e tentar conectar-se por SSH ao IP público do (s) destino (s). Por exemplo, se eu correr:

ansible -m ping tag_env_dev

Em seguida, ele tenta se conectar ao IP público, apesar de o IP privado ser preferível (por motivos de segurança, complexidade e custo). Eu tentei ajustar as seguintes opções no meu arquivo 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 

Se eu executar ./ec2.py --list --refresh-cache | grep -B 5 -A 5 "tag_env_dev" , obtenho um resultado apenas com o IP público retornado:

"tag_env_dev": [
  "{{public ip here}}"
], 

Após cada tentativa subseqüente, eu corri ./ec2.py --list --refresh-cache para limpar e regenerar o cache. Então, eu re-executei ansible -m ping tag_env_dev (ou similar) e obterei um tempo limite de conexão no SSH para o endereço IP público da instância.

Confirmei que posso SSH no "nome do host público" (que resolve dentro de um VPC para o IP privado) e no IP privado diretamente, mas não no IP público diretamente (como esperado). Portanto, não é um problema importante de autenticação.

Eu também tenho uma função do IAM à qual esse servidor é atribuído, com muitas permissões para executar essas operações (por exemplo, ele tem somente leitura para ec2 e vpc).

Informação adicional:

Estou correndo de uma instância ec2 no mesmo VPC que o alvo de teste. E o grupo de segurança no destino é configurado para permitir o SSH a partir de seu intervalo interno de blocos do CIDR. O host ansible também tem uma função do IAM que é suficiente para descobrir o IP privado do alvo

Qualquer ajuda seria muito apreciada.

    
por cupcakes 10.11.2017 / 23:34

2 respostas

3

Aqui está uma amostra de trabalho do ec2.ini (testado com 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

Em seguida, as instâncias devem ser listadas usando seu IP privado como identificador:

./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, 
...
    
por 11.11.2017 / 00:42
1

No ec2.ini, edite esta linha:

vpc_destination_variable = ip_address

Para isso:

vpc_destination_variable = private_ip_address

A partir do 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

link

    
por 19.07.2018 / 20:32