LabHub

Ansible 실전 · 조건과 반복 · 실습

조건과 반복으로 분기 압축하기

LabHub 에서 이어서 보기

목표

복사·붙여넣기로 늘어나던 태스크를 데이터와 반복으로 접고, 조건으로 항목을 걸러낼 수 있게 됩니다.

왜 중요한가

거의 같은 태스크가 여러 개 있으면 그중 하나만 다른 실수가 반드시 생기고, 코드를 읽어서는 찾기 어렵습니다. 태스크를 하나로 줄이면 실수할 자리도 하나가 되고, 데이터는 표처럼 보여 빠진 칸이 눈에 띕니다. 반복을 쓸 때 실무에서 자주 걸리는 것은 세 가지입니다. 로그 노출 — 딕셔너리를 그대로 돌면 그 안의 값이 전부 로그에 찍히므로 loop_control.label 이 필요합니다. 멱등성 — 반복이 열 번 돌면 비멱등의 피해도 열 배입니다. 조합 폭발 — 두 리스트의 곱은 금방 커집니다. 그리고 until 로 무언가를 기다릴 때는 "이 시간 안에 안 되면 진짜 문제"라는 판단을 재시도 횟수에 담으세요.

단계

1. /root/ans/loops/site.yml 에서 loop/root/ans/loops/simple/ 아래에 alpha, beta, gamma 디렉터리를 만드세요. 태스크는 하나여야 합니다.
2. /opt/lab/fixtures/ansible/users.ymlapp_users 를 읽어 각 항목의 dirmode 권한으로 만드세요 — /root/ans/loops/deploy(0750), /root/ans/loops/metrics(0755), /root/ans/loops/backup(0700).
3. 같은 반복에 when 을 걸어 0755 보다 엄격한 항목의 디렉터리에만 PRIVILEGED 파일을 남기세요 — /root/ans/loops/deploy/PRIVILEGED/root/ans/loops/backup/PRIVILEGED 는 생기고 /root/ans/loops/metrics/PRIVILEGED 는 생기면 안 됩니다.
4. loop_controllabel 로 로그를 정리하고 실행 출력을 /root/ans/loops/out/run.txt 로 저장하세요. 로그에 item=deploy 형태의 축약 라벨이 보이고 딕셔너리 전체는 보이면 안 됩니다.
5. until/retries/delay 를 쓴 대기 태스크를 만들고, 성공 결과를 /root/ans/loops/out/ready.txtready 라는 내용으로 남기세요.
6. 환경(dev,stage,prod) × 컴포넌트(app,worker) 조합으로 /root/ans/loops/matrix/<환경>-<컴포넌트>.conf 6개를 만드세요 (예: /root/ans/loops/matrix/dev-app.conf, /root/ans/loops/matrix/prod-worker.conf). 각 파일에는 env=<환경>component=<컴포넌트> 줄이 들어갑니다.
7. /root/ans/loops/collected/ 로 matrix 의 .conf 6개를 패턴으로 모아 복사하세요. 파일 이름을 하나씩 적으면 안 됩니다.
8. /root/ans/loops/out/loops.json 을 만드세요. users(3개, 각 항목에 privileged 불리언), matrix_files(6) 을 담습니다. 그리고 두 번째 실행 결과를 /root/ans/loops/out/run2.txt 로 저장하되 changed=0 이어야 합니다.

참고

단계 8개

  1. 리스트 반복으로 디렉터리 3개 만들기
  2. 딕셔너리 리스트 돌기
  3. 조건에 맞는 항목만 처리하기
  4. 로그에 찍히는 라벨 정리하기
  5. 조건이 참이 될 때까지 재시도하기
  6. 두 리스트의 모든 조합 만들기
  7. 패턴으로 파일 모으기
  8. 반복 결과 보고서와 재실행 확인