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

failed_when

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

 

failed_when 활용 사례

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

주로 아래와 같은 사용 사례가 있을 수 있습니다.

 

사례1 : 스크립트의 출력 결과에 특정 문구(예: error 또는 fail)가 검출되면 작업 실패 처리

  tasks:
    - name: backup etc directory
      ansible.builtin.command:
        cmd: /root/backup.sh
      register: results
      failed_when: results.stdout == "backup failed"

backup.sh 스크립트 출력 결과에 “backup failed”라는 문구가 검출되면 스크립트가 정상 종료되었다 하더라도 강제로 작업을 실패 처리합니다.

# ansible-playbook fail.yaml 
...
TASK [backup etc directory] ****************************************************************
fatal: [node1]: FAILED! => {"changed": true, "cmd": ["/root/backup.sh"], "delta": "0:00:00.004794", "end": "2023-10-04 00:03:36.050039", "failed_when_result": true, "msg": "", "rc": 0, "start": "2023-10-04 00:03:36.045245", "stderr": "", "stderr_lines": [], "stdout": "backup failed", "stdout_lines": ["backup failed"]}

PLAY RECAP **********************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

작업 결과를 보면 “rc”: 0으로 스크립트는 정상 실패 되었지만, 스크립트 결과에 “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을 사용하면 작업 성공 여부에 상관없이 실패 조건을 추가로 지정할 수 있습니다. 특정 유저가 있는지 확인한다거나 파일시스템 용량이 충분한지 확인하는 등 다양한 실패 조건을 추가하여 사용할 수 있습니다.

 

참조

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

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top