Ansible 실전 · 같은 이름을 심을 수 있는 자리가 스물두 개다 · 실습
변수 우선순위를 문서가 아니라 측정으로 세우기
목표
같은 이름의 변수를 열두 자리에 한 자리씩 심어 가며 무엇이 이기는지 직접 재고, 그 결과를 팀이 읽을 수 있는 순위 표로 남길 수 있게 됩니다.
왜 중요한가
"분명히 group_vars 에 적었는데 다른 값이 뜬다" 는 신고는 오류로 나타나지 않습니다. 플레이북은 성공하고 파일은 만들어지고 내용만 다릅니다. 문법 검사도 린트도 이걸 못 잡습니다. 잡을 수 있는 것은 "지금 이 자리에서 이 이름이 무엇으로 풀리는가" 를 재 보는 일뿐입니다. 그래서 이 실습은 문서의 목록을 옮겨 적지 않고 측정합니다. 한 번 재 본 사람은 표를 외우지 않아도 다음에 무엇을 먼저 의심할지 압니다. 그리고 마지막에 도달할 결론은 표가 아닙니다 - 자리를 줄이는 설계가 표를 아는 것보다 강합니다.
단계
1. /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 를 남기세요.
2. /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 를 남기세요.
3. /root/ans/prec/p03.yml 을 만들어 플레이 vars: 에 svc_tier: play-vars 를 심고 web1 을 재세요. 인벤토리는 2단계의 inv-vars 를 쓰고 결과는 /root/ans/prec/out/03.txt 에 남기세요.
4. /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 입니다.
5. /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 를 남기세요.
6. /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 에 값을 쓰세요.
7. /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 를 남기세요.
8. /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](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html) · [Precedence rules](https://docs.ansible.com/ansible/latest/reference_appendices/general_precedence.html) · [Build your inventory](https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html) · [combine filter](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/combine_filter.html)
단계 8개
- 바닥 자리 - 롤 기본값
- 인벤토리 안의 세 자리
- 플레이 vars 가 인벤토리를 덮는다
- 뜻밖의 자리 - vars_files
- 밖에서 덮기 어려운 자리 - 롤 vars
- 좁을수록 높다 - 블록과 태스크
- 실행 중에 생긴 값과 롤에 넘긴 인자
- 명령줄과 딕셔너리, 그리고 순위 표