A automação de infraestrutura é essencial para operações de TI modernas. Ferramentas como o Ansible permitem o gerenciamento e a configuração de múltiplos servidores de forma remota, eficiente e idempotente. Este artigo explora os fundamentos do Ansible, sua arquitetura, princípios de operação e fornece exemplos práticos de seus módulos mais comuns.
Arquitetura e Conceitos Fundamentais do Ansible
O Ansible é uma ferramenta de automação de TI open-source, desenvolvida em Python. Ele permite a configuração de sistemas, o deploy de aplicações e a orquestração de tarefas complexas. Sua arquitetura é baseada em uma estrutura simples: um nó de controle (control node) que gerencia nós gerenciados (managed nodes) via SSH, sem necessidade de instalar agentes ou software especial nestes últimos.
Seu funcionamento depende de vários componentes centrais:
- Inventário (Host Inventory): Um arquivo (geralmente
/etc/ansible/hosts) que define e organiza os hosts ou grupos de hosts que serão gerenciados. - Módulos: Peças de código que realizam tarefas específicas (instalar um pacote, copiar um arquivo, etc.). O Ansible executa um módulo em um host remoto, coleta os resultados e os apaga.
- Playbooks: Arquivos YAML que descrevem um conjunto de tarefas (plays) a serem executadas nos hosts definidos. Eles permitem a orquestração de configurações complexas.
- Plugins: Estendem a funcionalidade base do Ansible, por exemplo, para logging, conexões alternativas ou busca de inventário dinâmico.
As principais características que tornam o Ansible popular são: ser agenteless (não requer daemon no cliente), baseado em SSH, usar YAML legível para Playbooks e fornecer uma ampla biblioteca de módulos reutilizáveis.
Princípio de Operação
O fluxo de trabalho padrão do Ansible segue estas etapas:
- Um usuário ou um sistema de CI/CD executa um comando
ansibleouansible-playbooka partir do nó de controle. - O Ansible analisa o playbook/comando, carrega as variáveis e o inventário para identificar os hosts alvo.
- Para cada host no inventário, o Ansible estabelece uma conexão SSH (usando chaves públicas).
- O módulo Python necessário para a tarefa é transferido para o diretório temporário do host remoto e executado.
- Os resultados da execução são coletados pelo nó de controle via JSON.
- O módulo temporário no host remoto é removido.
A saída do comando fornece feedback colorido: verde indica que nenhuma alteração foi necessária, amarelo mostra que uma alteração foi aplicada com sucesso, e vermelho sinaliza um erro durante a execução.
Exemplo Prático de Configuração Inicial
Considere um cenário com um servidor de controle (dc-control) e três servidores de aplicação (dc-web-01, dc-web-02, dc-web-03). O primeiro passo é garantir a comunicação segura e sem senha via SSH.
# No servidor de controle (dc-control), gerar um par de chaves SSH
ssh-keygen -t ed25519 -C "ansible-key"
# Distribuir a chave pública para os nós gerenciados
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@10.0.1.51
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@10.0.1.52
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@10.0.1.53
# Testar a conexão sem senha
for host in 10.0.1.51 10.0.1.52 10.0.1.53; do ssh user@$host "echo Conectado a $(hostname)"; done
Em seguida, instale o Ensible no nó de controle e configure o inventário.
# Instalar o Ansible (exemplo para distribuições baseadas em Debian)
sudo apt update
sudo apt install ansible -y
# Verificar a versão
ansible --version
# Editar o inventário
sudo nano /etc/ansible/hosts
# Conteúdo do arquivo de inventário:
[webservers]
10.0.1.51
10.0.1.52
10.0.1.53
Teste a conectividade com todos os hosts usando o módulo ping.
ansible webservers -m ping
# Saída esperada para cada host:
# 10.0.1.51 | SUCCESS => {
# "changed": false,
# "ping": "pong"
# }
# ...
Módulos Ad-Hoc Comuns
Comandos ad-hoc permitem a execução rápida de tarefas simples em um ou mais hosts.
1. Módulo command (ou shell)
Executa um comando no host remoto. O módulo shell dá acesso ao shell do sistema, permitindo pipes e redirecionamentos.
# Verificar o espaço em disco em todos os webservers
ansible webservers -m shell -a "df -h /"
# Reiniciar um serviço específico em um host
ansible 10.0.1.51 -m command -a "systemctl restart nginx.service"
2. Módulo apt
Gerencia pacotes em sistemas Debian/Ubuntu.
# Atualizar a lista de repositórios e instalar o pacote 'htop' em todos os hosts
ansible webservers -m apt -a "name=htop state=present update_cache=yes"
3. Módulo copy
Copia um arquivo do nó de controle para os hosts remotos.
# Copiar um arquivo de configuração local para os hosts remotos, definindo permissões
ansible webservers -m copy -a "src=./configs/app.conf dest=/etc/app/ mode=0644 owner=www-data"
4. Módulo template
Semelhante ao copy, mas renderiza templates Jinja2 antes de copiar.
# Supondo um template 'nginx.conf.j2'
ansible webservers -m template -a "src=./templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf"
5. Módulo service
Gerencia serviços do sistema.
# Garantir que o serviço Nginx esteja iniciado e habilitado no boot
ansible webservers -m service -a "name=nginx state=started enabled=yes"
6. Módulo user
Cria e gerencia contas de usuários.
# Criar um usuário 'deploy' com um shell e adicioná-lo ao grupo 'www-data'
ansible webservers -m user -a "name=deploy shell=/bin/bash groups=www-data append=yes"
Estes módulos, combinados em Playbokos YAML, formam a base para automatizações robustas, garantindo consistência e reprodutibilidade em ambientes de produção.