Build the precedence table from measurements, not from the docs
한국어 원문으로 표시합니다.
목표
같은 이름의 변수를 열두 자리에 한 자리씩 심어 가며 무엇이 이기는지 직접 재고, 그 결과를 팀이 읽을 수 있는 순위 표로 남길 수 있게 됩니다.
왜 중요한가
"분명히 group_vars 에 적었는데 다른 값이 뜬다" 는 신고는 오류로 나타나지 않습니다. 플레이북은 성공하고 파일은 만들어지고 내용만 다릅니다. 문법 검사도 린트도 이걸 못 잡습니다. 잡을 수 있는 것은 "지금 이 자리에서 이 이름이 무엇으로 풀리는가" 를 재 보는 일뿐입니다. 그래서 이 실습은 문서의 목록을 옮겨 적지 않고 측정합니다. 한 번 재 본 사람은 표를 외우지 않아도 다음에 무엇을 먼저 의심할지 압니다. 그리고 마지막에 도달할 결론은 표가 아닙니다 - 자리를 줄이는 설계가 표를 아는 것보다 강합니다.
단계
/root/ans/prec/inventory/hosts.ini에 web1·web2 를 적고(ansible_host=127.0.0.1,ansible_port=2222,ansible_user=root),/root/ans/prec/roles/probe/에 측정용 롤을 만드세요.defaults/main.yml에svc_tier: role-defaults와probe_out을 두고,tasks/main.yml은WINNER={{ svc_tier }}를 debug 로 보여 준 뒤 같은 값을probe_out경로에 쓰는 두 태스크로 채우세요./root/ans/prec/p01.yml로 web1 에 이 롤을 돌려/root/ans/prec/out/01.txt를 남기세요./root/ans/prec/inv-vars/를 디렉터리 인벤토리로 만드세요.hosts.yml에 web 그룹(web1·web2)과 db 그룹(db1)을 적고,group_vars/all.yml에inv-all,group_vars/web.yml에inv-web,host_vars/web2.yml에inv-host를svc_tier로 심으세요./root/ans/prec/p02.yml로 세 호스트 모두를 재어/root/ans/prec/out/02-<호스트>.txt를 남기세요./root/ans/prec/p03.yml을 만들어 플레이vars:에svc_tier: play-vars를 심고 web1 을 재세요. 인벤토리는 2단계의inv-vars를 쓰고 결과는/root/ans/prec/out/03.txt에 남기세요./root/ans/prec/vars/tier.yml에svc_tier: vars-file을 적고,/root/ans/prec/p04.yml은 3단계와 똑같이 플레이vars:에play-vars를 남겨 둔 채vars_files:로 그 파일을 읽게 하세요. 결과는/root/ans/prec/out/04.txt입니다./root/ans/prec/roles/probe_locked/에 두 번째 측정 롤을 만드세요.vars/main.yml에svc_tier: role-vars를 두고(defaults에는probe_out만 둡니다),tasks/main.yml은 probe 와 같게 씁니다./root/ans/prec/p05.yml은 4단계와 같은 두 자리를 그대로 둔 채 이 롤을 불러/root/ans/prec/out/05.txt를 남기세요./root/ans/prec/p06.yml을 만드세요. 플레이는vars_files:로 tier.yml 을 읽고, 블록 하나에vars: {svc_tier: block-vars}를 붙입니다. 블록 안의 첫 태스크는probe_locked롤을 불러/root/ans/prec/out/06-block.txt를 남기고, 둘째 태스크는 자기vars:에svc_tier: task-vars를 붙여/root/ans/prec/out/06-task.txt에 값을 쓰세요./root/ans/prec/p07.yml을 만드세요. 먼저set_fact로svc_tier: set-fact를 세운 뒤, 태스크vars:에task-vars를 붙인 태스크가 값을/root/ans/prec/out/07-setfact.txt에 쓰게 하고, 마지막에probe_locked롤을 부르며svc_tier: role-param을 넘겨/root/ans/prec/out/07-roleparam.txt를 남기세요./root/ans/prec/vars/limits.yml에base_limits와svc_limits를{cpu: "1", memory: 1Gi}로 두고,/root/ans/prec/p08.yml이-e svc_tier=extra-vars와 함께 돌 때/root/ans/prec/out/08.txt에 명령줄 값이 적히게 하세요. 같은 플레이북에서 태스크vars:로svc_limits: {memory: 2Gi}를 준 결과와combine으로 합친 결과를/root/ans/prec/out/08-hash.json에replaced·combined두 키로 남기고, 열두 자리의 측정 결과를/root/ans/prec/out/rank.md에 표로 적으세요.
참고
- 측정용 롤은 값을 판단하지 않습니다. 지금 보이는 값을 화면(
WINNER=...)과 파일에 그대로 옮길 뿐입니다. 이 자를 1단계에서 만들어 끝까지 씁니다. - 인벤토리 안의 승부는 플레이북 없이도 볼 수 있습니다.
ansible-inventory -i <인벤토리> --list가 합쳐진 결과를 JSON 으로 줍니다. - 디렉터리로 준 인벤토리 안에서는 무시되는 확장자가 있습니다. 호스트가 하나도 안 보이면 파일 이름부터 의심하세요.
- 흔한 실수: 우열을 재면서 아래 자리를 지워 버리는 것. 두 자리가 동시에 있어야 무엇이 이겼는지 알 수 있습니다.
- 흔한 실수: 산출물 파일을 손으로 고치는 것. 채점은 파일뿐 아니라 플레이북을 점검 모드로 다시 태워 지금도 같은 값이 나오는지 봅니다.
- Using Variables · Precedence rules · Build your inventory · combine filter
바닥 자리 - 롤 기본값
/root/ans/prec/inventory/hosts.ini 에 web1·web2 를 적고(ansible_host=127.0.0.1, ansible_port=2222, ansible_user=root), /root/ans/prec/roles/probe/ 에 측정용 롤을 만드세요. defaults/main.yml 에 svc_tier: role-defaults 와 probe_out 을 두고, tasks/main.yml 은 WINNER={{ svc_tier }} 를 debug 로 보여 준 뒤 같은 값을 probe_out 경로에 쓰는 두 태스크로 채우세요. /root/ans/prec/p01.yml 로 web1 에 이 롤을 돌려 /root/ans/prec/out/01.txt 를 남기세요.
이 롤이 이 실습 내내 쓰는 자입니다. 어느 자리에서 값이 오든 롤은 그저 '지금 보이는 값' 을 적기만 하면 됩니다. 결과 파일 경로는 플레이마다 달라야 하니 그것도 변수로 받으세요.
인벤토리 안의 세 자리
/root/ans/prec/inv-vars/ 를 디렉터리 인벤토리로 만드세요. hosts.yml 에 web 그룹(web1·web2)과 db 그룹(db1)을 적고, group_vars/all.yml 에 inv-all, group_vars/web.yml 에 inv-web, host_vars/web2.yml 에 inv-host 를 svc_tier 로 심으세요. /root/ans/prec/p02.yml 로 세 호스트 모두를 재어 /root/ans/prec/out/02-<호스트>.txt 를 남기세요.
디렉터리 인벤토리 안에서는 무시되는 확장자가 있습니다. 호스트가 하나도 안 보이면 파일 이름부터 의심하세요. 결과 파일 이름에 호스트를 넣으려면 경로 자체를 템플릿으로 쓰면 됩니다.
플레이 vars 가 인벤토리를 덮는다
/root/ans/prec/p03.yml 을 만들어 플레이 vars: 에 svc_tier: play-vars 를 심고 web1 을 재세요. 인벤토리는 2단계의 inv-vars 를 쓰고 결과는 /root/ans/prec/out/03.txt 에 남기세요.
인벤토리에 이미 값이 있는데도 이 자리가 이기는지 보는 것이 목적입니다. 롤은 그대로 쓰고 플레이만 새로 씁니다.
뜻밖의 자리 - vars_files
/root/ans/prec/vars/tier.yml 에 svc_tier: vars-file 을 적고, /root/ans/prec/p04.yml 은 3단계와 똑같이 플레이 vars: 에 play-vars 를 남겨 둔 채 vars_files: 로 그 파일을 읽게 하세요. 결과는 /root/ans/prec/out/04.txt 입니다.
아래에 적은 것이 위에 적은 것을 이기는 자리입니다. 두 자리를 모두 남겨 두어야 우열이 드러나니 플레이 vars 를 지우지 마세요.
밖에서 덮기 어려운 자리 - 롤 vars
/root/ans/prec/roles/probe_locked/ 에 두 번째 측정 롤을 만드세요. vars/main.yml 에 svc_tier: role-vars 를 두고(defaults 에는 probe_out 만 둡니다), tasks/main.yml 은 probe 와 같게 씁니다. /root/ans/prec/p05.yml 은 4단계와 같은 두 자리를 그대로 둔 채 이 롤을 불러 /root/ans/prec/out/05.txt 를 남기세요.
같은 롤 디렉터리 안에서도 defaults 와 vars 는 정반대 성격입니다. 하나는 맨 아래, 하나는 한참 위입니다. 그래서 새 롤을 따로 만드는 것입니다 - probe 는 바닥 자리를 재는 자로 그대로 남겨 둡니다.
좁을수록 높다 - 블록과 태스크
/root/ans/prec/p06.yml 을 만드세요. 플레이는 vars_files: 로 tier.yml 을 읽고, 블록 하나에 vars: {svc_tier: block-vars} 를 붙입니다. 블록 안의 첫 태스크는 probe_locked 롤을 불러 /root/ans/prec/out/06-block.txt 를 남기고, 둘째 태스크는 자기 vars: 에 svc_tier: task-vars 를 붙여 /root/ans/prec/out/06-task.txt 에 값을 쓰세요.
블록 안에서 롤을 부르면 롤 vars 위에 블록 변수가 얹힙니다. 둘째 태스크는 롤을 거치지 않고 직접 파일을 써도 됩니다 - 재려는 것은 자리이지 롤이 아닙니다.
실행 중에 생긴 값과 롤에 넘긴 인자
/root/ans/prec/p07.yml 을 만드세요. 먼저 set_fact 로 svc_tier: set-fact 를 세운 뒤, 태스크 vars: 에 task-vars 를 붙인 태스크가 값을 /root/ans/prec/out/07-setfact.txt 에 쓰게 하고, 마지막에 probe_locked 롤을 부르며 svc_tier: role-param 을 넘겨 /root/ans/prec/out/07-roleparam.txt 를 남기세요.
실행 중에 세운 값은 미리 적어 둔 자리들보다 높습니다. 그런데 그 위에 하나가 더 있습니다 - 롤을 부르며 넘긴 값입니다.
명령줄과 딕셔너리, 그리고 순위 표
/root/ans/prec/vars/limits.yml 에 base_limits 와 svc_limits 를 {cpu: "1", memory: 1Gi} 로 두고, /root/ans/prec/p08.yml 이 -e svc_tier=extra-vars 와 함께 돌 때 /root/ans/prec/out/08.txt 에 명령줄 값이 적히게 하세요. 같은 플레이북에서 태스크 vars: 로 svc_limits: {memory: 2Gi} 를 준 결과와 combine 으로 합친 결과를 /root/ans/prec/out/08-hash.json 에 replaced·combined 두 키로 남기고, 열두 자리의 측정 결과를 /root/ans/prec/out/rank.md 에 표로 적으세요.
명령줄 값이 정말 이기는지 보려면 플레이 안에 다른 자리들도 남겨 두어야 합니다. 표는 낮은 자리부터 한 줄씩, 각 줄에 그 자리에서 측정된 값을 적으세요 - 앞 단계의 산출물이 근거입니다.