Usando Ansible para Automatização de Configuração e Deploy

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:

  1. Um usuário ou um sistema de CI/CD executa um comando ansible ou ansible-playbook a partir do nó de controle.
  2. O Ansible analisa o playbook/comando, carrega as variáveis e o inventário para identificar os hosts alvo.
  3. Para cada host no inventário, o Ansible estabelece uma conexão SSH (usando chaves públicas).
  4. O módulo Python necessário para a tarefa é transferido para o diretório temporário do host remoto e executado.
  5. Os resultados da execução são coletados pelo nó de controle via JSON.
  6. 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.

Tags: Ansible Automação de TI Gestão de Configuração Playbook Módulos Ansible

Publicado em 7-29 04:23