Criar e Aplicar uma Role Reutilizável

AnsibleBeginner
Pratique Agora

Introdução

As Roles agrupam padrões, tarefas, templates, arquivos e handlers em uma estrutura reutilizável. Elas mantêm os playbooks curtos e facilitam o compartilhamento da automação.

Neste laboratório, você criará uma role manualmente, adicionará padrões, um template e tarefas, e então a aplicará a dois aliases de host.

Criar um Projeto de Prática de Role

Nesta etapa, você criará um projeto com um diretório de roles e dois aliases de host web locais.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
roles_path = ./roles
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

A configuração roles_path = ./roles informa ao Ansible onde procurar pelos nomes das roles utilizadas pelos playbooks. Sem ela, o Ansible poderia pesquisar apenas nos caminhos de roles do sistema ou do nível de usuário.

Criar a Estrutura de Diretórios da Role

Nesta etapa, você criará os diretórios principais da role. O diretório defaults armazena variáveis de baixa precedência, tasks armazena a lógica das tarefas e templates armazena templates Jinja2. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo quando o LabEx executa cada etapa separadamente.

cd /home/labex/project/rhce-ansible
mkdir -p roles/web_banner/{defaults,tasks,templates}
find roles/web_banner -maxdepth 2 -type d | sort

A saída deve mostrar a raiz da role, além de defaults, tasks e templates. Esses nomes são significativos para o Ansible; por exemplo, tasks/main.yml é o ponto de entrada de tarefas para a role.

Adicionar Padrões da Role e um Template

Nesta etapa, você adicionará variáveis padrão e um template. A role usará esses valores, a menos que um playbook ou inventário os substitua. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo quando o LabEx executa cada etapa separadamente.

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/defaults/main.yml <<'EOF'
---
banner_message: Welcome to RHCE Ansible Prep
EOF
cat > roles/web_banner/templates/banner.txt.j2 <<'EOF'
Host: {{ inventory_hostname }}
Message: {{ banner_message }}
EOF

Os padrões (defaults) são variáveis de role de baixa precedência. Eles fornecem à role um valor utilizável quando o playbook ou o inventário não fornecem um, permitindo que quem os chama possa substituí-los posteriormente.

cat roles/web_banner/defaults/main.yml roles/web_banner/templates/banner.txt.j2

O template combina o alias do host atual com a mensagem padrão. Quando a role é executada para dois hosts, o mesmo template deve renderizar duas linhas Host: diferentes.

Adicionar Tarefas da Role e Aplicar a Role

Nesta etapa, você adicionará o arquivo tasks/main.yml e um playbook que aplica a role. A role cria um diretório de host e renderiza um arquivo de banner por host. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo quando o LabEx executa cada etapa separadamente.

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/tasks/main.yml <<'EOF'
---
- name: Ensure host banner directory exists
  ansible.builtin.file:
    path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
    state: directory
    mode: '0755'

- name: Render host banner
  ansible.builtin.template:
    src: banner.txt.j2
    dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
    mode: '0644'
EOF
cat > playbooks/apply-role.yml <<'EOF'
---
- name: Apply reusable web banner role
  hosts: web
  gather_facts: false
  roles:
    - role: web_banner
EOF

O arquivo de tarefas da role contém a implementação, enquanto o playbooks/apply-role.yml permanece curto e apenas nomeia a role. Este é o principal valor das roles: uma estrutura reutilizável sem repetir cada tarefa em todos os playbooks.

ansible-playbook playbooks/apply-role.yml --syntax-check

Executar o Playbook Baseado em Role

Nesta etapa, você executará o playbook e inspecionará os arquivos renderizados. O playbook permanece curto porque a role carrega a implementação reutilizável. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo quando o LabEx executa cada etapa separadamente.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/apply-role.yml | tee reports/role-run.txt

A execução deve processar a role uma vez por alias de host no grupo web. Um resumo bem-sucedido com failed=0 significa que a role foi encontrada através do roles_path e suas tarefas foram concluídas.

cat managed/web1/banner.txt managed/web2/banner.txt

Os arquivos renderizados devem compartilhar a mesma mensagem, mas ter linhas Host: diferentes. Isso prova que a role reutilizou a mesma lógica enquanto ainda renderizava dados específicos para cada host.

Resumo

Você construiu uma estrutura de role reutilizável, adicionou padrões, tarefas e um template, aplicou a role a partir de um playbook e verificou a saída renderizada.