Introdução
Depois de instalar o Ansible e configurar o inventário, o próximo passo natural é escrever playbooks — arquivos YAML que descrevem, de forma declarativa, o estado desejado dos seus servidores. Neste tutorial, reunimos exemplos práticos e comentados de playbooks para Ubuntu Linux, cobrindo cenários comuns em ambientes de TI industrial: instalação de pacotes, criação de usuários, configuração de firewall, gerenciamento de serviços e deploy de aplicações. Todos os exemplos são funcionais e podem ser adaptados diretamente ao seu ambiente.
Pré-requisitos
- Ansible já instalado no nó de controle (veja nosso tutorial de instalação no Ubuntu).
- Inventário configurado em
hosts.inicom pelo menos um host Ubuntu de destino. - Acesso SSH funcional e usuário com permissões sudo nos hosts gerenciados.
Exemplo 1: Instalação e atualização de pacotes
Um dos usos mais comuns do Ansible é garantir que um conjunto de pacotes esteja sempre instalado e atualizado:
---
- name: Instalar pacotes essenciais no Ubuntu
hosts: all
become: true
tasks:
- name: Atualizar cache do apt
apt:
update_cache: yes
cache_valid_time: 3600
- name: Instalar pacotes basicos
apt:
name:
- htop
- curl
- vim
- net-tools
- unzip
state: presentExemplo 2: Criação de usuários e chaves SSH
Gerenciar usuários manualmente em dezenas de servidores é propenso a erros. Este playbook cria um usuário de automação e configura sua chave pública:
---
- name: Criar usuario de automacao
hosts: all
become: true
tasks:
- name: Criar grupo de automacao
group:
name: automacao
state: present
- name: Criar usuario ansible-svc
user:
name: ansible-svc
group: automacao
shell: /bin/bash
create_home: yes
- name: Adicionar chave publica SSH
authorized_key:
user: ansible-svc
state: present
key: "{{ lookup('file', 'chaves/ansible-svc.pub') }}"Exemplo 3: Configuração do firewall UFW
Padronizar regras de firewall é essencial para a segurança em ambientes industriais. O exemplo abaixo libera apenas as portas necessárias:
---
- name: Configurar firewall UFW
hosts: all
become: true
tasks:
- name: Instalar UFW
apt:
name: ufw
state: present
- name: Permitir SSH
ufw:
rule: allow
port: "22"
proto: tcp
- name: Permitir HTTP e HTTPS
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "80"
- "443"
- name: Habilitar UFW
ufw:
state: enabled
policy: denyExemplo 4: Gerenciamento de serviços systemd
Garantir que serviços críticos estejam sempre ativos é fundamental em servidores de supervisão (SCADA/MES):
---
- name: Garantir servicos ativos
hosts: servidores_industriais
become: true
tasks:
- name: Garantir que o servico Docker esteja rodando
systemd:
name: docker
state: started
enabled: true
- name: Reiniciar servico de monitoramento
systemd:
name: node_exporter
state: restarted
when: ansible_facts['os_family'] == "Debian"Exemplo 5: Deploy de uma aplicação via Docker
Playbook completo que instala o Docker e sobe um container de aplicação, útil para gateways de coleta de dados industriais:
---
- name: Deploy de aplicacao via Docker
hosts: gateways
become: true
vars:
imagem_app: "registry.astechsolutions.com.br/coletor-dados:latest"
tasks:
- name: Instalar dependencias do Docker
apt:
name:
- docker.io
- python3-pip
state: present
- name: Instalar biblioteca docker para Python
pip:
name: docker
- name: Subir container do coletor de dados
docker_container:
name: coletor-dados
image: "{{ imagem_app }}"
state: started
restart_policy: unless-stopped
ports:
- "8080:8080"
env:
MODBUS_HOST: "192.168.10.50"
MODBUS_PORT: "502"Executando os playbooks
Todos os exemplos acima são executados da mesma forma, apontando para o inventário e o arquivo do playbook:
ansible-playbook -i hosts.ini nome-do-playbook.yml --check
ansible-playbook -i hosts.ini nome-do-playbook.ymlO uso da flag --check simula a execução sem aplicar mudanças reais, permitindo validar o playbook antes de rodar em produção.
Boas práticas
- Sempre teste playbooks com
--checke--diffantes de aplicar em servidores de produção. - Separe variáveis sensíveis (senhas, tokens) em arquivos protegidos com Ansible Vault.
- Use nomes descritivos em cada task (
name:) para facilitar a leitura dos logs de execução. - Prefira módulos idempotentes (como
apt,systemd,user) em vez de comandos shell diretos sempre que possível. - Organize playbooks grandes em roles reutilizáveis à medida que a automação cresce.