DEV Community

Cover image for Usando Inventário Dinâmico com Ansible e AWS para Criar e Configurar Instâncias EC2
Marcos Vilela
Marcos Vilela

Posted on

Usando Inventário Dinâmico com Ansible e AWS para Criar e Configurar Instâncias EC2

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
Enter fullscreen mode Exit fullscreen mode

Para listar os hosts disponíveis:

ansible-inventory -i inventories/aws_ec2.yml --graph
Enter fullscreen mode Exit fullscreen mode

Exemplo de saída:

@all:
  |--@aws_nome_do_grupo:
  |  |--75.172.111.222
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Execução:

ansible-playbook -i inventories/aws_ec2.yml playbooks/configurar.yml -l tag_Name_nome_do_grupo
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Descobrindo o IP da instância

Com o inventário dinâmico, basta rodar:

ansible-inventory -i inventories/aws_ec2.yml --list | jq
Enter fullscreen mode Exit fullscreen mode

Ou:

ansible-inventory -i inventories/aws_ec2.yml --graph
Enter fullscreen mode Exit fullscreen mode

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)