Gerenciar Serviços com Handlers

AnsibleBeginner
Pratique Agora

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.