Automação de infraestrutura dinamica utilizando Ansible

Publicado em Mon 14 April 2025 na categoria Automação • 2 min de leitura

O inventário dinâmico do Ansible é uma forma que permite que o Ansible descubra e gerencie automaticamente hosts em ambientes dinâmicos, como a AWS, sem a necessidade de manter arquivos de inventário estáticos.

Como funciona

O Ansible consulta a API da AWS em tempo real para obter informações atualizadas sobre instâncias EC2 e outros recursos, refletindo imediatamente qualquer alteração na infraestrutura, como criação, remoção ou alteração de instância

O plugin também retornará instâncias que foram criadas fora do Ansible e permitirá que o Ansible as gerencie.

Pacotes necessários:

  • Ansible
  • amazon.aws (ansible-galaxy collection install amazon.aws)
  • botocore
  • boto3
  • awscli

Autenticação para acesso AWS

Se o seu controlador Ansible não estiver na AWS, a autenticação será realizada especificando seu acesso e chave secreta como variáveis de ambiente (ENV),argumentos do plugin de inventário ou configurando o arquivo ~/.aws/credentials

Exemplo do arquivo ~/.aws/credentials:

# [default]
# aws_access_key_id = 123456
# aws_secret_access_key = ABCdefGHIjklMNOpqrSTUvwxZ

Exemplo de variaveis de ambiente:

export aws_access_key_id = 123456
export aws_secret_access_key = ABCdefGHIjklMNOpqrSTUvwxZ

Configurando um exemplo básico

Agora habilite o plugin no Ansible.cfg:

[inventory]
enable_plugins = aws_ec2

Para começar a usar o plugin de inventário dinâmico aws_ec2 crie um arquivo com o esquema de nome de arquivo aceito e documentado para o plugin (um arquivo de configuração YAML que termina com aws_ec2.(yml|yaml), por exemplo, demo.aws_ec2.yml).

plugin: aws_ec2                     # Define o plugin de inventário dinâmico a ser usado (aws_ec2)
regions:
  - us-east-1                       # Lista de regiões AWS a serem consultadas (aqui, apenas us-east-1)
filters:
  tag:Project: spot-cluster         # Filtra instâncias pela tag Project com valor 'spot-cluster'
  instance-state-name: running      # Considera apenas instâncias em estado 'running'
keyed_groups:
  - key: tags.OS                    # Agrupa hosts pela tag 'OS'
    prefix: os                      # Prefixa o grupo com 'os'
  - key: tags.Cluster               # Agrupa hosts pela tag 'Cluster'
    prefix: rabbitmq                # Prefixa o grupo com 'rabbitmq'
hostnames:
  - tag:Name                        # Usa o valor da tag 'Name' como hostname preferencial
  - private-ip-address              # Se não houver tag Name, usa o IP privado como hostname
compose:
  ansible_host: public_ip_address                   # Define o endereço que o Ansible usará para conectar (IP público)
  name: tags.Name | default('unnamed-instance')     # Define uma variável 'name' com a tag Name ou 'unnamed-instance'
  public_ip: public_ip_address                      # Cria a variável 'public_ip' com o IP público da instância
  private_ip: private_ip_address                    # Cria a variável 'private_ip' com o IP privado da instância
  os_type: tags.OS | default('unknown')             # Cria a variável 'os_type' com a tag OS ou 'unknown'

Após as configurações realizadas, execute o comando abaixo

ansible-inventory -i aws_ec2.yml --graph

Deverá retornar o seguinte output:

@all:
  |--@ungrouped:
  |--@aws_ec2:
  |  |--rabbitmq-node-2
  |  |--rabbitmq-master-1
  |  |--rabbitmq-node-1
  |--@os_Debian:
  |  |--rabbitmq-node-2
  |  |--rabbitmq-master-1
  |  |--rabbitmq-node-1
  |--@rabbitmq_nodes:
  |  |--rabbitmq-node-2
  |  |--rabbitmq-node-1
  |--@rabbitmq_master:
  |  |--rabbitmq-master-1

Após as configurações realizadas, toda essa estrutura será gerenciada pelo Ansible, incluindo novas instancias que podem ser criadas, desde que sejam aplicadas as tags configuradas no arquivo aws_ec2.yml

Simples assim :)