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 :)