Introdução
Quando você começa a usar o Ansible, colocar tudo em um único arquivo grande, como playbook.yml, funciona bem. Mas, à medida que sua automação cresce para centenas de linhas, esse arquivo se torna difícil de organizar.
A solução são as roles do Ansible.
As roles são como pastas em um arquivo. Em vez de manter um documento enorme, você separa o conteúdo em pastas lógicas: uma pasta para tarefas de "Servidor Web", outra para tarefas de "Banco de Dados" e assim por diante.
As roles são importantes porque, com o tempo, a automação se aproxima da engenharia de software. Quando os playbooks ultrapassam algumas tarefas, estrutura, nomenclatura e reutilização se tornam tão importantes quanto fazer a primeira execução funcionar.
Neste laboratório, você vai:
- Criar uma estrutura padronizada de Role usando
ansible-galaxy. - Mover as tarefas para essa Role.
- Executar a Role a partir de um "Playbook principal" simples.
As roles são importantes porque a automação escalável precisa de estrutura. À medida que as bases de código crescem, a organização se torna tão importante quanto obter a primeira execução bem-sucedida.
Inicializar uma Role
Primeiro, vamos criar a estrutura de diretórios. Você poderia criar todas as pastas manualmente, mas o Ansible inclui uma ferramenta chamada ansible-galaxy que faz isso por você.
Esse layout padrão é útil porque oferece locais previsíveis para tarefas, variáveis, arquivos, templates e handlers em cada role. Quando a estrutura permanece consistente, as equipes conseguem ler a automação umas das outras com mais facilidade.
Vá para o diretório do projeto:
cd ~/project
Crie um diretório para armazenar suas roles:
mkdir roles
Agora, crie uma nova role chamada myrole. Pense nisso como a criação de um "pacote" ou "módulo" para sua automação.
ansible-galaxy init roles/myrole
Veja o que foi criado:
ls -R roles/myrole
Você verá várias pastas (tasks, handlers, vars etc.).
- tasks: onde ficam as etapas reais, como instalar, iniciar e copiar.
- vars: onde ficam as variáveis.
- files: onde ficam os arquivos estáticos, como imagens.
Hoje, vamos nos concentrar na pasta tasks.
Definir as tarefas da Role
Agora precisamos adicionar algumas ações à nossa role. A lista principal de tarefas de uma role fica em tasks/main.yml.
Vamos criar uma tarefa simples que instala o comando tree, um utilitário útil para visualizar estruturas de diretórios.
Abra o arquivo de tarefas da role:
nano roles/myrole/tasks/main.yml
Adicione o conteúdo a seguir. Observe que não começamos com tasks: aqui, porque já estamos dentro do arquivo de tarefas.
---
## tasks file for roles/myrole
- name: Ensure tree is installed
apt:
name: tree
state: present
become: yes
Diferença importante: em um playbook normal, você tem uma seção tasks:. Dentro de uma role, o próprio arquivo é a lista de tarefas; por isso, basta começar a listá-las diretamente.
Essa separação é uma das razões pelas quais as roles melhoram a reutilização. A role concentra uma parte específica da lógica de automação, enquanto o playbook decide quando e onde incluí-la.
Salve e saia.
Criar o Playbook principal
Agora você tem uma Role, mas uma Role não é executada por si só. Você precisa de um "Playbook principal" para chamá-la.
Crie um arquivo chamado site.yml na pasta principal do projeto:
nano ~/project/site.yml
Este playbook será muito curto. Ele apenas diz: "Nestes hosts, execute esta role".
A partir desse ponto, o playbook passa a funcionar mais como um orquestrador do que como um contêiner de todos os detalhes. Essa é a mudança de arquitetura que as roles devem proporcionar.
---
- hosts: localhost
connection: local
roles:
- myrole
Entenda o código:
roles:: em vez de uma listatasks:, fornecemos uma lista de roles.- myrole: o Ansible procura uma pasta chamadamyroledentro do diretórioroles/e executa o conteúdo detasks/main.yml.
Salve e saia.
Validar e executar
Antes de executar, vamos verificar se não cometemos erros de digitação. O Ansible possui um verificador de sintaxe integrado.
Execute este comando:
ansible-playbook -i inventory --syntax-check site.yml
Se tudo estiver correto, o comando exibirá apenas playbook: site.yml.
Se houver erros, leia a mensagem com atenção: geralmente ela indica o número exato da linha onde a indentação está incorreta.
Agora, execute o playbook de verdade:
ansible-playbook -i inventory site.yml
Você deverá ver a execução da tarefa da sua role: TASK [myrole : Ensure tree is installed] ... changed
Resumo
Neste laboratório, você aprendeu a maneira "profissional" de estruturar o Ansible.
- Inicializou uma Role: usou
ansible-galaxypara criar a estrutura padrão de pastas. - Definiu tarefas: colocou sua lógica dentro de
tasks/main.yml. - Usou a Role: chamou a role a partir de um playbook principal
site.ymllimpo e simples.
À medida que você escrever mais automações, criará roles para tudo, como apache, mysql e common, tornando seu código reutilizável e fácil de ler.


