[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
은 매우 유용한 도구입니다. 이를 적절히 활용하면 불완전한 성공을 효과적으로 걸러내고, 자동화된 운영 품질을 높일 수 있습니다.
댓글
댓글 쓰기