[Ansible] Error Handling #3 - failed_when 작업 실패 조건 지정



Ansible에서 작업 결과와 무관하게 조건에 따라 실패 여부를 제어할 수 있는 failed_when 지시어의 활용 방법을 설명합니다.

 

failed_when 지시어란?

failed_when 지시어를 사용하면 작업에 조건을 걸어 조건이 충족될 때 작업을 실패 처리할 수 있습니다. 이 방법은 정상적으로 작업이 실행되어도 작업의 결과를 체크해서 특정 조건이 만족하지 않으면 실패시키는 방법입니다.


failed_when 활용 사례

예를 들어 스크립트를 돌린다고 가정해 보도록 하겠습니다. 해당 스크립트가 오류 없이 실행된다면 returncord(출력 결과) 0을 반환합니다. 그럼 앤서블에서는 정상 종료로 인식한 뒤 나머지 작업을 이어 나갑니다. 하지만 스크립트가 정상 종료되었다고 해서 작업이 정상적으로 끝났다는 보장은 없습니다. 이럴 때 failed_when 지시어를 작업에 추가하여 작업이 잘 끝났는지를 확인해 볼 수 있습니다.

 

사례1 : 스크립트의 출력 결과에 특정 문구가 포함되면 실패 처리

예를 들어 backup.sh 스크립트를 실행했을 때 출력 결과에 “backup failed”라는 문구가 포함되면, 스크립트가 정상적으로 종료되었더라도 작업을 실패로 간주할 수 있습니다.
  tasks:
    - name: backup etc directory
      ansible.builtin.command:
        cmd: /root/backup.sh
      register: results
      failed_when: results.stdout == "backup failed"

이렇게 설정한 후 플레이북을 실행하면 출력 결과에 따라 실패 처리 여부가 결정됩니다. 예제 출력은 다음과 같습니다:

# ansible-playbook fail.yaml 
...
TASK [backup etc directory] ****************************************************************
fatal: [node1]: FAILED! => {"changed": true, "stdout": "backup failed"...}

스크립트 자체는 오류 코드 없이 종료됐지만, 스크립트 결과에 “stdout”: “backup failed”라는 문구가 검출 되었으므로 작업이 실패하게 되는 예제입니다.

 

사례2 : 특정 파일이 존재하지 않으면 않으면 실패 처리

아래는 failed_when을 이용하여 /run/httpd/httpd.pid 파일이 생성되었는지 체크합니다. 만약 파일이 생성되어 있지 않다면 failed_when 조건이 충족하므로 작업에 실패하게 됩니다.

---
- name: Ensure a file exists
  hosts: node1
  tasks:
    - name: file status check
      ansible.builtin.stat:
        path: /run/httpd/httpd.pid
      register: results
      failed_when: results.stat.exists == false

마치며

failed_when 지시어는 작업이 기술적으로는 성공했더라도, 사용자 정의 조건을 기반으로 실패로 간주할 수 있도록 도와줍니다. 이는 스크립트 실행 결과나 특정 리소스 상태(예: 파일 존재 여부, 변수 값 등)를 검사하여 보다 정교한 실패 판단이 가능하게 해줍니다.

복잡한 운영 환경에서 서비스 상태나 시스템 조건에 따라 성공 여부를 유연하게 판별할 필요가 있는 경우, failed_when은 매우 유용한 도구입니다. 이를 적절히 활용하면 불완전한 성공을 효과적으로 걸러내고, 자동화된 운영 품질을 높일 수 있습니다.

 

참조

https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_error_handling.html#defining-failure

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Linux Command] sudo command 설명

[Ansible Modules] Fetch module 설명 및 활용