LabHub

Ansible 기초 · 멱등성과 핸들러 · 실습

두 번 돌려도 조용한 플레이북 만들기

LabHub 에서 이어서 보기

목표

같은 플레이북을 몇 번을 돌려도 두 번째부터는 아무것도 바뀌지 않는 상태를 만들고, 그 사실을 로그와 보고서로 증명합니다.

왜 중요한가

멱등성은 "예쁜 코드"의 문제가 아니라 자동화를 실제로 쓸 수 있게 만드는 조건입니다. 두 번째 실행이 안전하다는 확신이 있어야 크론으로 주기 실행을 걸어 드리프트를 잡을 수 있고, 파이프라인 중간 실패 후에도 겁 없이 재실행할 수 있습니다. 반대로 매번 서비스를 재시작하는 플레이북은 사람들이 피하게 되고, 피하는 자동화는 곧 없는 자동화입니다. 핵심 장치는 상태를 아는 모듈, 셸 명령의 가드(creates/changed_when), 그리고 변경이 있을 때만 도는 핸들러입니다. 특히 핸들러가 플레이 끝에 몰려 실행된다는 점은 꼭 기억하세요 — 중간에 플레이가 실패하면 핸들러가 통째로 사라져 "설정은 바뀌었는데 서비스는 옛 설정을 보고 있는" 상태가 됩니다.

단계

1. /root/ans/idem/site.yml 을 만들어 실행하고 출력을 /root/ans/idem/out/run1.txt 로 저장하세요. 첫 실행의 changed 는 2 이상이어야 합니다.
2. 같은 플레이북을 다시 실행해 /root/ans/idem/out/run2.txt 로 저장하세요. 이번에는 changed=0 이어야 합니다.
3. reload app 이라는 핸들러를 정의하고, 설정을 다루는 태스크에서 notify 로 부르세요. 핸들러는 실행될 때 /root/ans/idem/artifacts/reload.marker 를 만들어야 합니다.
4. 두 번째 실행 로그(run2.txt)에 RUNNING HANDLER 가 없어야 합니다. 첫 실행 로그에는 있어야 합니다.
5. command/shell 태스크를 하나 넣되 creates 가드를 붙이세요. 그 태스크는 /root/ans/idem/artifacts/stamp.txt 에 한 줄을 쓰고, 두 번 실행해도 파일에 한 줄만 있어야 합니다.
6. 조회만 하는 태스크에 changed_when 을, 실패 판정이 필요한 태스크에 failed_when 을 각각 최소 한 번씩 쓰세요.
7. 플레이북을 --check 로 실행한 출력을 /root/ans/idem/out/check.txt 로 저장하세요. changed=0, failed=0 이어야 합니다.
8. /root/ans/idem/out/idempotency.json 을 만드세요. run1_changed(2 이상), run2_changed(0), handler_fired(1 또는 true), verdict("idempotent") 네 키를 담습니다.

참고

단계 8개

  1. 첫 실행에서 변경 만들기
  2. 두 번째 실행에서 changed=0 만들기
  3. 핸들러 정의하고 notify 로 부르기
  4. 두 번째 실행에서 핸들러가 안 돌게 하기
  5. 셸 명령에 creates 가드 붙이기
  6. 보고 기준 직접 정하기
  7. 점검 모드에서도 변경 없음 확인하기
  8. 멱등성 판정 보고서 만들기