LabHub
배우기 러닝패스 코스

Ansible基礎

最初のプレイブックを書きチェックモードで回す

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 값 하나, 최상위 키 이름 하나가 틀려 있습니다. 오류 메시지가 어느 줄을 가리키는지 보세요.