Introdução e Preparação do Ambiente
O Ansible é uma ferramenta de automação de TI de código aberto que simplifica o gerenciamento de configurações, o provisionamento de infraestrutura e a orquestração de deployments. Diferente de outras ferramentas, ele opera sem agentes (agentless), utilizando SSH para comunicação.
Ambiente de Laboratório
Para os exemplos práticos, utilizaremos a seguinte topologia de rede baseada em sistemas Ubuntu 22.04 LTS:
- Nó de Controle (ansible-control): 172.16.50.10
- Nó Gerenciado 1 (web-node-01): 172.16.50.11
- Nó Gerenciado 2 (web-node-02): 172.16.50.12
Nota: Certifique-se de que o acesso SSH sem senha (usando chaves RSA/Ed25519) esteja configurado entre o nó de controle e os nós gerenciados, e que o firewall permita a porta 22.
Instalação Moderna do Ansible
Embora versões antigas exigissem a compilação manual de dependências Python, a abordagem recomendada atualmente é utilizar o gerenciador de pacotes do sistema ou o pip.
Instalação via APT (Recomendado para Ubuntu/Debian)
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install -y ansible
Encapsulamento em Docker
Para ambientes isolados e reproduzíveis, encapsular o Ansible em um contêiner é uma prática excelente. Abaixo, um Dockerfile otimizado:
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
openssh-client \
sshpass \
vim \
iputils-ping \
&& pip3 install --no-cache-dir ansible \
&& mkdir -p /etc/ansible \
&& echo -e "[defaults]\nhost_key_checking = False\nforks = 10" > /etc/ansible/ansible.cfg
WORKDIR /workspace
CMD ["/bin/bash"]
Para construir e executar a imagem:
docker build -t ansible-automation:latest .
docker run -it --rm -v $(pwd):/workspace ansible-automation:latest
Configuração e Inventário
O Ansible utiliza um arquivo de inventário para definir os hosts gerenciados. O caminho padrão é /etc/ansible/hosts, mas você pode especificar inventários personalizados via linha de comando.
Definindo o Inventário
# /etc/ansible/hosts
[webservers]
172.16.50.11 ansible_user=ubuntu
172.16.50.12 ansible_user=ubuntu
[dbservers]
172.16.50.13 ansible_user=ubuntu
[webservers:vars]
http_port=8080
max_clients=200
Comandos Ad-Hoc e Módulos Essenciais
Comandos ad-hoc são úteis para tarefas rápidas e pontuais. A sintaxe básica é: ansible <grupo> -m <módulo> -a "<argumentos>".
Módulo Ping (Verificação de Conectividade)
ansible webservers -m ping
Módulos Shell e Command
O módulo command é mais seguro, pois não procesa variáveis de ambiente ou redirecionamentos. Para comandos complexos, use o shell.
# Verificando uso de disco com shell
ansible webservers -m shell -a "df -h | grep /dev/sda1"
# Criando um diretório com command
ansible webservers -m command -a "mkdir -p /opt/app/logs" -b
Módulos File e Copy (Gerenciamento de Arquivos)
# Alterando permissões e propriedade
ansible webservers -m file -a "path=/opt/app/logs state=directory mode=0755 owner=www-data group=www-data" -b
# Copiando conteúdo diretamente para um arquivo
ansible webservers -m copy -a "content='Bem-vindo ao servidor de produção\n' dest=/etc/motd mode=0644" -b
Módulo Apt (Gerenciamento de Pacotes)
# Instalando Nginx e Redis
ansible webservers -m apt -a "name=nginx,redis-server state=present update_cache=yes" -b
# Removendo pacotes
ansible webservers -m apt -a "name=redis-server state=absent" -b
Módulos User e Group
# Criando grupo e usuário de aplicação
ansible webservers -m group -a "name=appgroup gid=2000 system=yes" -b
ansible webservers -m user -a "name=deployer group=appgroup shell=/bin/bash create_home=yes state=present" -b
Módulo Cron (Agendamento de Tarefas)
# Agendando um script de backup diário às 02:00
ansible webservers -m cron -a "name='daily_backup' minute=0 hour=2 job='/opt/scripts/backup.sh >> /var/log/backup.log 2>&1'" -b
Playbooks e YAML
Playbooks são a linguagem de orquestração do Ansible, escritos em YAML. Eles permitem definir estados desejados de forma declarativa e idempotente.
Estrutura Básica de um Playbook
# webserver_setup.yml
---
- name: Configuração de Servidores Web
hosts: webservers
become: yes
vars:
app_dir: /var/www/html
nginx_port: 8080
tasks:
- name: Instalar dependências do Nginx
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- curl
- unzip
- name: Criar diretório da aplicação
file:
path: "{{ app_dir }}"
state: directory
owner: www-data
group: www-data
- name: Alterar porta do Nginx
lineinfile:
path: /etc/nginx/sites-available/default
regexp: '^(\s*)listen 80;'
line: '\1listen {{ nginx_port }};'
notify: Reiniciar Nginx
handlers:
- name: Reiniciar Nginx
service:
name: nginx
state: restarted
Execução e Opções do Playbook
# Execução padrão
ansible-playbook webserver_setup.yml
# Modo de verificação (Dry-run)
ansible-playbook webserver_setup.yml --check
# Executar apenas tarefas específicas por tag
ansible-playbook webserver_setup.yml --tags "install_packages"
Templates com Jinja2
O módulo template permite renderizar arquivos dinamicamente usando a engine Jinja2, substituindo variáveis do Ansible no arquivo de destino.
Exemplo de Template Nginx
Arquivo templates/nginx.conf.j2:
server {
listen {{ nginx_port }};
server_name {{ ansible_hostname }}.local;
location / {
root {{ app_dir }};
index index.html;
}
{% if enable_ssl is defined and enable_ssl %}
# Configurações SSL seriam inseridas aqui
{% endif %}
}
Tarefa no Playbook para aplicar o template:
- name: Aplicar configuração dinâmica do Nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/conf.d/app.conf
owner: root
group: root
mode: '0644'
notify: Reiniciar Nginx
Organização com Roles
Para projetos complexos, o uso de Roles é essencial. Roles permitem estruturar variáveis, tarefas, handlers e templates em diretórios padronizados, promovendo a reutilização de código.
Estrutura de Diretórios de uma Role
roles/
nginx_role/
tasks/
main.yml # Lista principal de tarefas
handlers/
main.yml # Handlers (ex: reiniciar serviços)
templates/
nginx.conf.j2 # Templates Jinja2
vars/
main.yml # Variáveis de alta prioridade
defaults/
main.yml # Variáveis padrão (baixa prioridade)
files/
index.html # Arquivos estáticos para o módulo copy
Exemplo de Tasks e Handlers
roles/nginx_role/tasks/main.yml:
---
- name: Instalar Nginx
apt:
name: nginx
state: present
- name: Copiar template de configuração
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reload Nginx
- name: Garantir que o Nginx esteja ativo
systemd:
name: nginx
state: started
enabled: yes
roles/nginx_role/handlers/main.yml:
---
- name: Reload Nginx
systemd:
name: nginx
state: reloaded
Chamando Roles no Playbook
# site.yml
---
- name: Deploy de Infraestrutura Web
hosts: webservers
become: yes
roles:
- role: nginx_role
vars:
nginx_port: 80
enable_ssl: false
- role: app_deploy
tags: ['deployment', 'app']
Ao executar ansible-playbook site.yml, o Ansible carregará automaticamente as tasks, handlers e variáveis definidas dentro de cada role, mantendo o playbook principal limpo e legível.