Introdução
Handlers são tarefas especiais do Ansible que são executadas apenas quando notificadas por uma tarefa que realizou alguma alteração. Eles são comumente usados para recarregar e reiniciar serviços.
Neste laboratório, você implantará uma unidade systemd de demonstração segura, notificará os handlers quando o arquivo da unidade for alterado e verificará se o serviço está ativo e habilitado.
Criar um Projeto de Automação de Serviços
Nesta etapa, você criará um projeto para automação de serviços. Este laboratório utiliza um alias de host local porque o serviço representa um estado real do sistema na VM RHEL 10.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,files,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[service_hosts]
host ansible_connection=local
EOF
Mesmo com uma conexão local, o playbook gerenciará o estado real do systemd na VM. É por isso que este laboratório usa um alias de host e become: true posteriormente, em vez de simular vários hosts de serviço independentes.
Criar um Arquivo de Unidade systemd de Demonstração
Nesta etapa, você criará o arquivo de unidade de origem que o Ansible copiará para /etc/systemd/system. O serviço executa /usr/bin/sleep infinity, portanto, é seguro e fácil de verificar.
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 > files/rhce-handler-demo.service <<'EOF'
[Unit]
Description=RHCE handler demo service
[Service]
Type=simple
ExecStart=/usr/bin/sleep infinity
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
EOF
Esta unidade é intencionalmente inofensiva: ela inicia um processo sleep de longa duração e o reinicia caso ele encerre. A seção [Install] torna possível para o Ansible habilitar o serviço para o multi-user.target.
sed -n "1,12p" files/rhce-handler-demo.service
Verifique as linhas ExecStart e WantedBy antes de continuar. Se o arquivo de unidade de origem estiver incorreto, o Ansible implantará fielmente a definição de serviço incorreta.
Escrever um Playbook com Handlers
Nesta etapa, você escreverá um playbook que copia o arquivo de unidade e notifica os handlers. A tarefa meta: flush_handlers executa os handlers pendentes antes da tarefa de serviço, para que o systemd reconheça a nova unidade.
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 > playbooks/manage-service.yml <<'EOF'
---
- name: Deploy and manage the demo service
hosts: service_hosts
become: true
gather_facts: false
tasks:
- name: Install demo systemd unit
ansible.builtin.copy:
src: ../files/rhce-handler-demo.service
dest: /etc/systemd/system/rhce-handler-demo.service
mode: '0644'
notify:
- Reload systemd
- Restart demo service
- name: Run handlers before enabling the service
ansible.builtin.meta: flush_handlers
- name: Ensure demo service is active and enabled
ansible.builtin.systemd:
name: rhce-handler-demo.service
state: started
enabled: true
handlers:
- name: Reload systemd
ansible.builtin.systemd:
daemon_reload: true
- name: Restart demo service
ansible.builtin.systemd:
name: rhce-handler-demo.service
state: restarted
EOF
A tarefa copy notifica dois handlers apenas quando o arquivo de unidade é alterado. meta: flush_handlers executa quaisquer handlers pendentes antes que a tarefa systemd inicie e habilite o serviço, o que é importante porque o systemd deve recarregar os arquivos de unidade antes de reconhecer um novo serviço.
ansible-playbook playbooks/manage-service.yml --syntax-check
A verificação de sintaxe deve passar antes que o playbook escreva em /etc/systemd/system. Ela detecta erros de indentação na lista de tarefas e na seção handlers sem alterar o estado do serviço.
Executar o Playbook e Verificar o Serviço
Nesta etapa, você executará o playbook do serviço. A primeira execução deve instalar a unidade, recarregar o systemd, iniciar o serviço e habilitá-lo para a inicialização. 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/manage-service.yml | tee reports/service-first-run.txt
A primeira execução deve copiar o arquivo de unidade, recarregar o systemd, reiniciar o serviço de demonstração através do handler e, em seguida, garantir que o serviço esteja habilitado. Salvar a saída permite que você verifique se o caminho do handler foi executado.
systemctl is-active rhce-handler-demo.service
systemctl is-enabled rhce-handler-demo.service
is-active verifica o estado de execução para a inicialização atual, enquanto is-enabled verifica se o serviço está vinculado a um alvo de inicialização. As tarefas de serviço RHCE geralmente exigem ambos.
Alterar o Arquivo de Unidade e Acionar o Handler Novamente
Nesta etapa, você fará uma alteração controlada no arquivo de unidade de origem. Quando a tarefa de cópia detectar a alteração, ela notificará os handlers novamente. 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
O módulo lineinfile também pode editar arquivos locais através de um comando ad hoc. Aqui, ele altera apenas uma linha na unidade de origem.
ansible localhost -c local -m ansible.builtin.lineinfile -a 'path=files/rhce-handler-demo.service regexp=^RestartSec= line=RestartSec=3'
Isso altera o arquivo de origem, não a unidade instalada em /etc/systemd/system. A próxima execução do playbook deve notar a alteração na origem, copiar a unidade atualizada e notificar os handlers novamente.
ansible-playbook playbooks/manage-service.yml | tee reports/service-second-run.txt
grep -F RestartSec /etc/systemd/system/rhce-handler-demo.service
A unidade instalada agora deve mostrar RestartSec=3. O serviço deve permanecer ativo e habilitado porque os handlers recarregaram o systemd e reiniciaram o serviço de demonstração após a alteração do arquivo.
Resumo
Você implantou uma unidade systemd segura, usou handlers para recarregar o systemd e reiniciar o serviço, verificou o estado do serviço ativo e habilitado e acionou o handler com uma alteração controlada no arquivo de unidade.


