Durante um projeto recente, precisei automatizar a criação e configuração de instâncias EC2 com Ansible, para tarefas assim o ideal são ferramentas como Terraform e semelhantes, no entanto, para tarefas com menores fluxos e menos intervenções, o Ansible se torna um aliado a estas ações pontuais, reduzindo assim mais um ponto de responsabilidade, além de, com os avanços da ferramenta o mesmo pode manipular muito bem infraestrutura não somente o configurando. Neste assunto, usando inventário dinâmico via plugin aws_ec2
. O objetivo era simples: criar a instância uma vez e, depois disso, apenas configurar ou gerenciar, sem a recriar.
Neste post, mostro como resolvi problemas comuns nesse fluxo, como:
- Obter IP público via inventário dinâmico
- Executar tarefas apenas em instâncias já existentes
- Ligar instâncias desligadas com Ansible
Estrutura do Projeto
- Inventário dinâmico:
inventories/aws_ec2.yml
- Playbooks com tags (ex:
ec2_create_instance
,setup
) - Roles separadas para criação e configuração
- Chave SSH já cadastrada na AWS
Exemplo de Inventário Dinâmico
# inventories/aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
- us-east-1
keyed_groups:
- prefix: aws
key: tags.Name
Para listar os hosts disponíveis:
ansible-inventory -i inventories/aws_ec2.yml --graph
Exemplo de saída:
@all:
|--@aws_nome_do_grupo:
| |--75.172.111.222
Criando a instância (com tag ec2_create_instance
)
- name: Criar instância EC2
amazon.aws.ec2_instance:
name: "{{ instance_name }}"
image_id: "{{ ami_id }}"
instance_type: t3.micro
...
register: ec2_instance
- name: Adicionar host dinâmico
add_host:
name: "{{ ec2_instance.instances[0].network_interfaces[0].association.public_ip }}"
groups: aws_novo_grupo
when: ec2_instance is defined
Configurando a instância já existente
Após a criação, você pode aplicar configurações usando apenas o inventário dinâmico e uma tag da instância.
- name: Configurar instância
hosts: tag_Name_nome_do_grupo
become: true
tasks:
- name: Instalar NGINX
apt:
name: nginx
state: present
Execução:
ansible-playbook -i inventories/aws_ec2.yml playbooks/configurar.yml -l tag_Name_nome_do_grupo
Ligando uma instância desligada via Ansible
- name: Ligar instância EC2
hosts: localhost
tasks:
- name: Start EC2
amazon.aws.ec2:
instance_ids: [i-0abc1234def56789]
state: running
wait: yes
Descobrindo o IP da instância
Com o inventário dinâmico, basta rodar:
ansible-inventory -i inventories/aws_ec2.yml --list | jq
Ou:
ansible-inventory -i inventories/aws_ec2.yml --graph
Você verá os IPs públicos e os grupos associados dinamicamente.
Conclusão
Esse fluxo permite:
- Criar instâncias EC2 sob demanda
- Usar inventário dinâmico para evitar hardcoding de IPs
- Executar configurações de forma controlada
- Gerenciar instâncias existentes com segurança e reusabilidade
💬 Se você também usa Ansible com AWS e quer trocar ideias, comenta aí ou me manda uma mensagem! Estou sempre aprendendo e ajustando esse fluxo para ambientes reais de DevOps/SRE.
Top comments (0)