LabHub
배우기 러닝패스 코스

Ansible Fundamentals

Write Your First Playbook and Run It in Check Mode

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

플레이북으로 서버의 원하는 상태를 선언하고, 실행 전에 점검 모드로 영향 범위를 확인할 수 있게 됩니다.

왜 중요한가

셸 스크립트는 "무엇을 할지"를 적지만 플레이북은 "끝났을 때 어떤 상태여야 하는지"를 적습니다. 이 차이 때문에 같은 플레이북을 몇 번을 돌려도 결과가 같습니다. 그 성질을 만들어 내는 것은 문법이 아니라 모듈입니다 — file 모듈은 디렉터리가 이미 있으면 아무것도 하지 않고, 권한만 다르면 권한만 고칩니다. 반대로 command/shell 은 지금 상태를 모르기 때문에 항상 바꿨다고 보고합니다. 그래서 "전용 모듈이 있으면 셸을 쓰지 않는다"는 원칙이 스타일 취향이 아니라 정확성의 문제가 됩니다. 마지막으로 --check --diff 는 운영 서버에 처음 손대기 전 마지막 안전장치입니다.

단계

  1. /root/ans/play/site.yml 을 만드세요. 플레이 하나이며 name 이 있고 hostsweb 입니다. ansible-playbook -i /root/ans/inventory/hosts.ini --syntax-check 를 통과해야 합니다.
  2. file 모듈로 /root/ans/artifacts/app 디렉터리를 권한 0755 로 만드는 태스크를 추가하고 실행하세요.
  3. copy 모듈로 /root/ans/artifacts/app/app.conf 를 만드세요. 내용에 listen_port=8080env=lab 두 줄이 각각 한 줄씩 들어가야 합니다. 이때 env 의 값은 하드코딩하지 말고 app_env 변수로 빼고 기본값을 lab 으로 두세요 (6번에서 이 값을 바꿔 봅니다).
  4. 태스크를 3개 이상으로 만들고, 모든 태스크에 name 을 다세요.
  5. 설정을 다루는 태스크에 config 태그를 달고 --tags config 로 실행한 출력을 /root/ans/out/tags.txt 로 저장하세요.
  6. 플레이북을 --check --diff -e app_env=stage 로 실행하고 출력을 /root/ans/out/check.txt 로 저장하세요. 출력의 diff 에는 env=stage 가 보여야 하지만, 실제 /root/ans/artifacts/app/app.conf 는 여전히 env=lab 이어야 합니다. 이 단계에서는 절대 실제로 적용하지 마세요.
  7. /opt/lab/fixtures/ansible/motd.seed/root/ans/artifacts/motd 로 복사한 뒤, lineinfileWelcome=labhubOwner=platform-team 이 되도록 고치세요. Banner=unset 줄은 그대로 둬야 하고, Welcome= 로 시작하는 줄은 하나만 남아야 합니다.
  8. /opt/lab/fixtures/ansible/broken-play.yml/root/ans/play/fixed.yml 로 복사해 오류 네 군데를 고치고 실행하세요. 결과로 /root/ans/artifacts/fixed/report.txtfixed by student 가 들어가고, 핸들러 정의와 notify 가 살아 있어야 합니다.

참고

플레이북 뼈대 만들고 문법 검사 통과하기

/root/ans/play/site.yml 을 만드세요. 플레이 하나이며 name 이 있고 hostsweb 입니다. ansible-playbook -i /root/ans/inventory/hosts.ini --syntax-check 를 통과해야 합니다.

플레이북 최상위는 리스트입니다. 각 플레이에 name, hosts, tasks 를 넣고 --syntax-check 로 확인하세요.

file 모듈로 디렉터리 만들기

file 모듈로 /root/ans/artifacts/app 디렉터리를 권한 0755 로 만드는 태스크를 추가하고 실행하세요.

셸 명령 대신 file 모듈을 쓰세요. state 값과 mode 표기(따옴표)를 확인하세요.

copy 모듈로 설정 파일 배치하기

copy 모듈로 /root/ans/artifacts/app/app.conf 를 만드세요. 내용에 listen_port=8080env=lab 두 줄이 각각 한 줄씩 들어가야 합니다. 이때 env 의 값은 하드코딩하지 말고 app_env 변수로 빼고 기본값을 lab 으로 두세요 (6번에서 이 값을 바꿔 봅니다).

copy 모듈은 src 대신 content 로 내용을 직접 줄 수도 있습니다. 여러 줄은 YAML 블록 스칼라로 씁니다. 환경 값은 나중에 바꿔 볼 수 있게 변수로 빼 두세요.

모든 태스크에 이름 달기

태스크를 3개 이상으로 만들고, 모든 태스크에 name 을 다세요.

태스크가 3개 이상 있어야 하고, name 이 없는 태스크가 하나라도 있으면 안 됩니다.

태그 달고 일부만 실행하기

설정을 다루는 태스크에 config 태그를 달고 --tags config 로 실행한 출력을 /root/ans/out/tags.txt 로 저장하세요.

설정 관련 태스크에 tags: [config] 를 달고 --tags config 로 실행하세요. 태그가 없는 태스크도 반드시 하나는 남겨 두세요 — 그래야 좁혔다는 것이 보입니다.

한 가지 오해하기 쉬운 점: --tags 로 걸러진 태스크는 skipping 으로 표시되지 않습니다. 출력에서 아예 사라지고 skipped= 도 0 입니다. when: 으로 걸러진 것과는 다릅니다 — 그쪽은 태스크가 실행 대상에는 들어가되 조건에서 걸리므로 흔적이 남습니다.

점검 모드로 미리 보기

플레이북을 --check --diff -e app_env=stage 로 실행하고 출력을 /root/ans/out/check.txt 로 저장하세요. 출력의 diff 에는 env=stage 가 보여야 하지만, 실제 /root/ans/artifacts/app/app.conf 는 여전히 env=lab 이어야 합니다. 이 단계에서는 절대 실제로 적용하지 마세요.

--check --diff-e 로 다른 값을 넘겨 보세요. 출력에는 바뀔 내용이 보이지만 실제 파일은 그대로여야 합니다.

기존 파일의 특정 줄만 바꾸기

/opt/lab/fixtures/ansible/motd.seed/root/ans/artifacts/motd 로 복사한 뒤, lineinfileWelcome=labhubOwner=platform-team 이 되도록 고치세요. Banner=unset 줄은 그대로 둬야 하고, Welcome= 로 시작하는 줄은 하나만 남아야 합니다.

픽스처를 /root/ans/artifacts/motd 로 복사한 뒤 lineinfile 로 고치세요. regexp 로 기존 줄을 찾아야 줄이 늘어나지 않습니다.

고장난 플레이북 고치기

/opt/lab/fixtures/ansible/broken-play.yml/root/ans/play/fixed.yml 로 복사해 오류 네 군데를 고치고 실행하세요. 결과로 /root/ans/artifacts/fixed/report.txtfixed by student 가 들어가고, 핸들러 정의와 notify 가 살아 있어야 합니다.

모듈 인자 이름 두 개, state 값 하나, 최상위 키 이름 하나가 틀려 있습니다. 오류 메시지가 어느 줄을 가리키는지 보세요.