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을 사용하면 작업 성공 여부에 상관없이 실패 조건을 추가로 지정할 수 있습니다. 특정 유저가 있는지 확인한다거나 파일시스템 용량이 충분한지 확인하는 등 다양한 실패 조건을 추가하여 사용할 수 있습니다.