소개
핸들러 (Handlers) 는 변경 사항이 발생한 작업 (task) 으로부터 알림 (notify) 을 받았을 때만 실행되는 특수한 Ansible 작업입니다. 주로 서비스 재로드나 재시작을 수행할 때 사용됩니다.
이번 실습에서는 안전한 데모용 systemd 유닛을 배포하고, 유닛 파일이 변경될 때 핸들러를 호출하여 서비스가 활성화 및 실행 상태로 유지되는지 확인합니다.
서비스 자동화 프로젝트 생성
이 단계에서는 서비스 자동화를 위한 프로젝트를 생성합니다. 이 실습에서는 RHEL 10 VM 의 실제 시스템 상태를 관리하므로 로컬 호스트 별칭을 하나 사용합니다.
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
로컬 연결을 사용하더라도 플레이북은 VM 의 실제 systemd 상태를 관리합니다. 따라서 이 실습에서는 여러 개의 독립적인 서비스 호스트가 있는 것처럼 가장하는 대신, 하나의 호스트 별칭을 사용하고 나중에 become: true를 설정합니다.
데모 systemd 유닛 파일 생성
이 단계에서는 Ansible 이 /etc/systemd/system으로 복사할 소스 유닛 파일을 생성합니다. 이 서비스는 /usr/bin/sleep infinity를 실행하므로 안전하며 확인하기 쉽습니다.
이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령이 안정적으로 유지됩니다.
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
이 유닛은 무해하도록 설계되었습니다. 장시간 실행되는 sleep 프로세스를 시작하고, 종료되면 다시 시작합니다. [Install] 섹션 덕분에 Ansible 이 multi-user.target에 대해 서비스를 활성화할 수 있습니다.
sed -n "1,12p" files/rhce-handler-demo.service
계속하기 전에 ExecStart 및 WantedBy 라인을 확인하십시오. 소스 유닛 파일이 잘못되면 Ansible 은 잘못된 서비스 정의를 그대로 배포하게 됩니다.
핸들러가 포함된 플레이북 작성
이 단계에서는 유닛 파일을 복사하고 핸들러에 알림을 보내는 플레이북을 작성합니다. meta: flush_handlers 작업은 서비스 작업 전에 대기 중인 핸들러를 실행하므로, systemd 가 새로운 유닛을 인식할 수 있게 합니다.
이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.
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
copy 작업은 유닛 파일이 변경될 때만 두 개의 핸들러에 알림을 보냅니다. meta: flush_handlers는 systemd 작업이 시작되어 서비스를 활성화하기 전에 대기 중인 핸들러를 실행합니다. 이는 systemd 가 새로운 서비스를 인식하기 전에 유닛 파일을 다시 로드해야 하므로 매우 중요합니다.
ansible-playbook playbooks/manage-service.yml --syntax-check
플레이북이 /etc/systemd/system에 쓰기 작업을 수행하기 전에 구문 검사를 통과해야 합니다. 이는 서비스 상태를 변경하지 않고도 작업 목록이나 handlers 섹션의 들여쓰기 오류를 잡아냅니다.
플레이북 실행 및 서비스 확인
이 단계에서는 서비스 플레이북을 실행합니다. 첫 번째 실행 시 유닛을 설치하고, systemd 를 다시 로드하며, 서비스를 시작하고 부팅 시 활성화되도록 설정해야 합니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/manage-service.yml | tee reports/service-first-run.txt
첫 번째 실행 시 유닛 파일을 복사하고, systemd 를 다시 로드하며, 핸들러를 통해 데모 서비스를 재시작한 다음 서비스가 활성화되었는지 확인합니다. 출력을 저장하면 핸들러 경로가 실행되었는지 검토할 수 있습니다.
systemctl is-active rhce-handler-demo.service
systemctl is-enabled rhce-handler-demo.service
is-active는 현재 부팅 상태의 런타임 상태를 확인하고, is-enabled는 서비스가 부팅 타겟에 링크되어 있는지 확인합니다. RHCE 서비스 작업에서는 종종 이 두 가지 확인이 모두 필요합니다.
유닛 파일 변경 및 핸들러 재트리거
이 단계에서는 소스 유닛 파일을 제어된 방식으로 변경합니다. copy 작업이 변경 사항을 감지하면 핸들러를 다시 호출합니다.
이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.
cd /home/labex/project/rhce-ansible
lineinfile 모듈을 사용하여 애드혹 (ad hoc) 명령으로 로컬 파일을 편집할 수 있습니다. 여기서는 소스 유닛의 한 줄만 변경합니다.
ansible localhost -c local -m ansible.builtin.lineinfile -a 'path=files/rhce-handler-demo.service regexp=^RestartSec= line=RestartSec=3'
이 명령은 /etc/systemd/system에 설치된 유닛이 아니라 소스 파일을 변경합니다. 다음 플레이북 실행 시 소스 변경 사항을 감지하고, 업데이트된 유닛을 복사하며, 핸들러를 다시 호출해야 합니다.
ansible-playbook playbooks/manage-service.yml | tee reports/service-second-run.txt
grep -F RestartSec /etc/systemd/system/rhce-handler-demo.service
설치된 유닛에 RestartSec=3이 표시되어야 합니다. 파일이 변경된 후 핸들러가 systemd 를 다시 로드하고 데모 서비스를 재시작했으므로, 서비스는 계속 활성화 및 실행 상태를 유지해야 합니다.
요약
안전한 systemd 유닛을 배포하고, systemd 재로드 및 서비스 재시작을 위해 핸들러를 사용했으며, 서비스의 활성화 및 실행 상태를 확인하고, 유닛 파일 변경을 통해 핸들러가 정상적으로 트리거되는지 확인했습니다.


