Introdução
No laboratório anterior, você executou um único comando (ansible ... -m ping). Embora isso seja útil para verificações rápidas, o verdadeiro poder do Ansible está nos Playbooks.
Um playbook é um arquivo de texto que contém instruções de automação. Diferentemente de um script de shell comum, um playbook normalmente se concentra no estado final desejado, e não em cada etapa de baixo nível dos comandos.
Esse modelo baseado no estado desejado é uma das ideias mais importantes do Ansible. Em vez de dizer “execute estes comandos exatamente”, você normalmente descreve a condição que deve ser verdadeira quando a automação terminar.
Os playbooks são escritos em YAML, um formato de dados legível por humanos. Isso facilita a revisão, o compartilhamento e a manutenção da automação.
Neste laboratório, você escreverá um playbook que transforma um servidor em um servidor web ao:
- Instalar o Nginx (um servidor web popular).
- Garantir que o serviço do Nginx esteja em execução.
Depois, você executará esse playbook para configurar sua máquina local.
Criar o arquivo do Playbook
Começaremos criando o arquivo do playbook. Por convenção, o playbook principal costuma receber o nome site.yml.
Primeiro, verifique se você está no diretório do projeto:
cd ~/project
Agora, crie e abra um novo arquivo chamado site.yml usando o editor de texto nano:
nano site.yml
Na primeira linha do arquivo, digite três hifens. Isso marca o início de um documento YAML.
---
Regras importantes do YAML:
- A indentação é fundamental! Use espaços, geralmente 2, e não tabulações. Se a indentação estiver incorreta, o Ansible exibirá um erro.
- Salve o arquivo com frequência. No
nano, pressioneCtrl+Oe depoisEnterpara salvar, mas mantenha o arquivo aberto para as próximas etapas.
Definir o Play
Um playbook é composto por um ou mais “plays”. Um play associa um grupo de hosts às tarefas que você deseja executar neles.
Essa associação entre o grupo de hosts e as tarefas permite que um único playbook seja usado tanto em uma máquina quanto em muitas. A lógica permanece em um só lugar, enquanto o inventário determina onde ela será aplicada.
No arquivo site.yml, adicione as linhas a seguir abaixo de ---.
---
- hosts: webservers
become: yes
Entenda o código:
- hosts: webservers: informa ao Ansible: “Execute estas instruções em todos os servidores listados no grupo[webservers]do meu inventário.”become: yes: equivale a digitarsudoantes de um comando. Isso concede privilégios de root ao Ansible, necessários para instalar software.
Verifique se - hosts começa exatamente no início da linha, sem espaços antes do hífen.
Salve o arquivo (Ctrl+O, Enter).
Adicionar uma tarefa de instalação
Agora precisamos informar ao Ansible o que fazer. Para isso, adicionaremos uma lista de tarefas. Cada tarefa usa um módulo.
Usaremos o módulo apt (pois estamos no Ubuntu) para instalar o Nginx.
Atualize o arquivo site.yml para que ele fique assim:
---
- hosts: webservers
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
Entenda o código:
tasks:inicia a lista de tarefas.- name: ...é uma descrição para humanos. Ela será exibida na tela quando você executar o playbook.apt:chama o móduloapt.name: nginxespecifica o pacote que queremos instalar.state: presenté a parte “declarativa” principal. Não estamos dizendo “instale agora”. Estamos dizendo “garanta que ele esteja presente”.- Se o pacote estiver ausente, o Ansible o instalará.
- Se ele já estiver instalado, o Ansible não fará nada. Essa propriedade é chamada de idempotência.
A idempotência é fundamental no gerenciamento de configuração. Ela significa que você pode executar a mesma automação repetidamente com segurança e esperar resultados consistentes, sem efeitos colaterais duplicados.
Verifique a indentação:
tasksdeve ficar alinhado combecome.- namedeve ter indentação de 2 espaços.aptdeve ficar alinhado comname.nameestatedevem ter uma indentação adicional abaixo deapt.
Salve o arquivo.
Adicionar uma tarefa de serviço
Instalar o software não é suficiente; precisamos garantir que o programa esteja em execução. Para isso, usamos o módulo service.
Isso também mostra como os playbooks expressam o estado do sistema em camadas. Uma tarefa garante que o pacote exista, enquanto outra garante que o serviço esteja ativo. Juntas, elas descrevem o estado final que o host deve alcançar.
Adicione uma segunda tarefa à lista no arquivo site.yml.
---
- hosts: webservers
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
Entenda o código:
service:é o módulo que gerencia serviços do sistema, como osystemctl.state: startedgarante que o serviço esteja em execução. Se ele estiver parado, o Ansible o iniciará.
Importante: o - da segunda tarefa deve ficar exatamente alinhado com o - da primeira tarefa.
Salve o arquivo e saia do nano (Ctrl+X, depois Y e, por fim, Enter).
Executar o Playbook
Agora vem a parte prática: executar sua automação!
Usaremos o comando ansible-playbook. Precisamos informar qual playbook executar (site.yml) e qual inventário usar (hosts.ini).
Execute este comando:
ansible-playbook site.yml -i hosts.ini
Observe a saída. Você verá:
- Gathering Facts: primeiro, o Ansible verifica os detalhes do sistema.
- Install nginx: será exibido como
changed(em amarelo), pois o pacote precisou ser instalado. - Start nginx: será exibido como
changed(em amarelo) se o serviço precisou ser iniciado.
Se você executar exatamente o mesmo comando uma segunda vez, a saída aparecerá em verde e exibirá ok. Isso significa: “Tudo já está no estado desejado, portanto nada foi alterado.”
Por fim, verifique manualmente se o Nginx está em execução:
systemctl status nginx
Você deverá ver "Active: active (running)".
Resumo
Neste laboratório, você escreveu seu primeiro Playbook do Ansible. Você aprendeu:
- Sintaxe YAML: como estruturar um playbook usando a indentação correta.
- Plays: como definir
hosts(onde executar) ebecome(usar sudo). - Tarefas: como usar módulos como
apt(para instalar) eservice(para iniciar). - Idempotência: o conceito de que executar o playbook várias vezes é seguro e produz resultados estáveis.
Você passou de comandos executados manualmente para a definição de “Infraestrutura como Código”.


