Embora o meta: refresh_inventory
seja o "método preferido", tenho a tendência de gostar da proposta do OP de usar ec2_remote_facts
em conjunto com add_host
. Eu configurei um tal manual e ele tem a força para ser 100% dinâmico sem falhas de cache.
Assumindo que suas instâncias de ASG dispararam com a tag env: cool_asg_instance
, adicione o seguinte abaixo da chamada% play_bookbook:
- ec2_remote_facts:
filters:
"tag:env": "cool_asg_instance"
register: instance_facts
Você então reunirá um conjunto de dados JSON completo contendo todas as informações necessárias, a partir de onde você pode usar os recursos ec2_asg
no playbook para extrair endereços IP recém-criados, por exemplo:
- name: group hosts
add_host: hostname={{ item }} groups=launched
with_items: "{{ instance_facts.instances|selectattr('state', 'equalto', 'running')|map(attribute='private_ip_address')|list }}"
O filtro é cortesia desta postagem no blog: link
De agora em diante, você pode usar o grupo Jinja2
em seu arquivo YAML de implantação pai assim:
- hosts: launched
gather_facts: no
tasks:
- name: wait for SSH
wait_for: port=22 host="{{ inventory_hostname }}" search_regex=OpenSSH delay=5
Alguns podem perguntar por que a dor de cabeça, bem, imagine que, em vez de ter um launched
hediondo que irá userdata
Ansible e um manual da Internet, você pode acionar a configuração da instância de seu próprio centro de implantação configurando um simples SNS tópico que será publicado em uma fila SQS , assistido por um código python de 10 linhas ( link ) que acionará o Ansible quando uma nova instância for lançada.