最初のプレイブックを書きチェックモードで回す
한국어 원문으로 표시합니다.
목표
플레이북으로 서버의 원하는 상태를 선언하고, 실행 전에 점검 모드로 영향 범위를 확인할 수 있게 됩니다.
왜 중요한가
셸 스크립트는 "무엇을 할지"를 적지만 플레이북은 "끝났을 때 어떤 상태여야 하는지"를 적습니다. 이 차이 때문에 같은 플레이북을 몇 번을 돌려도 결과가 같습니다. 그 성질을 만들어 내는 것은 문법이 아니라 모듈입니다 — file 모듈은 디렉터리가 이미 있으면 아무것도 하지 않고, 권한만 다르면 권한만 고칩니다. 반대로 command/shell 은 지금 상태를 모르기 때문에 항상 바꿨다고 보고합니다. 그래서 "전용 모듈이 있으면 셸을 쓰지 않는다"는 원칙이 스타일 취향이 아니라 정확성의 문제가 됩니다. 마지막으로 --check --diff 는 운영 서버에 처음 손대기 전 마지막 안전장치입니다.
단계
/root/ans/play/site.yml을 만드세요. 플레이 하나이며name이 있고hosts는web입니다.ansible-playbook -i /root/ans/inventory/hosts.ini --syntax-check를 통과해야 합니다.file모듈로/root/ans/artifacts/app디렉터리를 권한0755로 만드는 태스크를 추가하고 실행하세요.copy모듈로/root/ans/artifacts/app/app.conf를 만드세요. 내용에listen_port=8080과env=lab두 줄이 각각 한 줄씩 들어가야 합니다. 이때env의 값은 하드코딩하지 말고app_env변수로 빼고 기본값을lab으로 두세요 (6번에서 이 값을 바꿔 봅니다).- 태스크를 3개 이상으로 만들고, 모든 태스크에
name을 다세요. - 설정을 다루는 태스크에
config태그를 달고--tags config로 실행한 출력을/root/ans/out/tags.txt로 저장하세요. - 플레이북을
--check --diff -e app_env=stage로 실행하고 출력을/root/ans/out/check.txt로 저장하세요. 출력의 diff 에는env=stage가 보여야 하지만, 실제/root/ans/artifacts/app/app.conf는 여전히env=lab이어야 합니다. 이 단계에서는 절대 실제로 적용하지 마세요. /opt/lab/fixtures/ansible/motd.seed를/root/ans/artifacts/motd로 복사한 뒤,lineinfile로Welcome=labhub와Owner=platform-team이 되도록 고치세요.Banner=unset줄은 그대로 둬야 하고,Welcome=로 시작하는 줄은 하나만 남아야 합니다./opt/lab/fixtures/ansible/broken-play.yml을/root/ans/play/fixed.yml로 복사해 오류 네 군데를 고치고 실행하세요. 결과로/root/ans/artifacts/fixed/report.txt에fixed by student가 들어가고, 핸들러 정의와 notify 가 살아 있어야 합니다.
참고
- 실습 파드는 실습마다 새로 뜹니다.
/root/ans/inventory/hosts.ini가 없으면 첫 실습에서 만든 것과 같은 인벤토리(web1·web2·db1,ansible_host=127.0.0.1,ansible_port=2222,ansible_user=root,[prod:children]에 web·db)를 먼저 다시 만드세요. 구조는/opt/lab/fixtures/ansible/inventory.sample.ini를 참고하면 됩니다. ansible-playbook -i 인벤토리 플레이북.yml이 기본 실행 형태입니다.-v를 늘릴수록 자세해집니다.- 태그로 실행하면 대상이 아닌 태스크는
skipping으로 표시됩니다. - 흔한 실수 1: 7번에서
lineinfile에regexp를 주지 않는 것. 그러면 같은 줄이 계속 추가됩니다. - 흔한 실수 2: 8번의 오류를 모두 YAML 문법 문제로 보는 것. 인자 이름과 값이 틀린 경우도 있으니 모듈 문서를 확인하세요.
플레이북 뼈대 만들고 문법 검사 통과하기
/root/ans/play/site.yml 을 만드세요. 플레이 하나이며 name 이 있고 hosts 는 web 입니다. 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=8080 과 env=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 로 복사한 뒤, lineinfile 로 Welcome=labhub 와 Owner=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.txt 에 fixed by student 가 들어가고, 핸들러 정의와 notify 가 살아 있어야 합니다.
모듈 인자 이름 두 개, state 값 하나, 최상위 키 이름 하나가 틀려 있습니다. 오류 메시지가 어느 줄을 가리키는지 보세요.