Ansible 기초 · 인벤토리가 여러 개일 때 · 실습
인벤토리를 디렉터리로 옮겼더니 그룹이 절반만 나왔다
목표
인벤토리 소스가 여러 개일 때 무엇이 합쳐지고 무엇이 이기는지를 하나씩 실측합니다. 마지막에는 '이 변수는 결국 어느 값이 이기는가' 를 답해 주는 도구를 직접 만듭니다.
왜 중요한가
인벤토리가 파일 하나일 때는 읽으면 압니다. 그런데 파일 하나로 끝나는 조직은 드뭅니다 — 공통 호스트는 플랫폼 팀이, 서비스별 호스트는 각 팀이 관리하고, 운영과 스테이징은 파일을 나누며, 클라우드 자원은 동적 소스가 만들어 냅니다. 그러면 사고가 두 종류로 납니다. 같은 그룹 이름 때문에 엉뚱한 서버가 대상에 들어오는 것, 그리고 옛 파일이나 새 group_vars 때문에 엉뚱한 값이 이기는 것입니다. 둘 다 파일을 읽어 추론하는 방식으로는 막지 못합니다. 막는 방법은 하나뿐입니다 — 합쳐진 결과를 실행 전에 기계에게 묻는 것. 이 실습은 그 질문을 여덟 번 던지고, 마지막에 그 질문을 대신 던져 주는 도구를 남깁니다.
단계
1. /root/ans/inv/src/base.ini 에 web 그룹(web1, web2)과 [web:vars] tier=base 를, /root/ans/inv/src/extra.ini 에 web 그룹(web3) · db 그룹(db1) · [web:vars] tier=extra 를 적으세요. 모든 호스트는 ansible_host=127.0.0.1 이고 base.ini 의 [all:vars] 에 ansible_port=2222 와 ansible_user=root 를 둡니다. -i 를 두 번 주어(base.ini 먼저) 합쳐진 결과를 /root/ans/inv/out/merged.json 에, 그래프를 /root/ans/inv/out/merged-graph.txt 에 저장하고, 합쳐진 뒤 web1 의 tier 가 무엇인지를 /root/ans/inv/out/two-sources.txt 에 tier=<값> 한 줄로 적으세요.
2. /root/ans/inv/dir/ 을 만들고 1단계의 두 파일과 같은 내용을 확장자 없이 10-base 와 20-extra 로 넣으세요. 거기에 /root/ans/inv/dir/30-late.ini 를 하나 더 두는데, 이 파일은 web 그룹에 web9 를 넣고 [web:vars] tier=late 를 적습니다. -i /root/ans/inv/dir 로 합쳐진 결과를 /root/ans/inv/out/dir-merged.json 에 저장하고, /root/ans/inv/out/dir-order.txt 에 두 줄을 적으세요 — 첫 줄은 web1 의 tier 를 tier=<값> 으로, 둘째 줄은 디렉터리를 훑을 때 건너뛰어진 파일 이름을 skipped=<파일이름> 으로.
3. /root/ans/inv/dir/group_vars/all.yml 에 pool: gv-all 과 owner: platform 을, /root/ans/inv/dir/group_vars/web.yml 에 pool: gv-web 을, /root/ans/inv/dir/host_vars/web1.yml 에 pool: hv-web1 을 적으세요. 그리고 /root/ans/inv/out/levels.json 에 세 호스트가 최종적으로 갖는 pool 값을 web1·web2·db1 세 키의 JSON 으로 적으세요.
4. /root/ans/inv/dir/20-extra 의 [web:vars] 에 region=inline-extra 를 더하고, /root/ans/inv/dir/group_vars/web.yml 에 region: file-web 을 더하세요. 그리고 /root/ans/inv/out/inline-vs-file.txt 에 두 줄을 적으세요 — 첫 줄은 web2 가 최종적으로 갖는 값을 region=<값> 으로, 둘째 줄은 그 값이 어디서 왔는지를 source=inline 또는 source=group_vars 중 하나로.
5. /root/ans/inv/prio/hosts.ini 를 만드세요 — 호스트 app1 이 alpha 와 zulu 두 그룹에 모두 속하고, [alpha:vars] 에 stack=from-alpha, [zulu:vars] 에 stack=from-zulu 를 적습니다. 그리고 [alpha:vars] 에 ansible_group_priority=10 을 더해 alpha 가 이기게 하세요. /root/ans/inv/out/priority-before.txt 에는 그 줄이 없을 때 이기는 값을, /root/ans/inv/out/priority-after.txt 에는 그 줄이 있을 때 이기는 값을 각각 stack=<값> 한 줄로 적으세요.
6. /root/ans/inv/tree/hosts.ini 를 만드세요 — web 그룹에 web1, db 그룹에 db1 을 넣고 두 그룹을 zprod 의 자식으로 묶습니다. [zprod:vars] 에 env=from-zprod 와 owner=platform 을, [web:vars] 에 env=from-web 을 적으세요. 그리고 /root/ans/inv/out/children.txt 에 세 줄을 사전순 그대로 적으세요 — db1.env=<값> · web1.env=<값> · web1.owner=<값>.
7. /root/ans/inv/pat/hosts.ini 를 만드세요 — web 그룹에 web1·web2·web3, db 그룹에 db1, 두 그룹을 prod 의 자식으로 묶고, staging 그룹에 web3 와 db1 을 넣습니다. 그리고 web:&prod:!staging 패턴에 맞는 호스트 이름만 한 줄에 하나씩 사전순으로 /root/ans/inv/out/pattern-hosts.txt 에 저장하고, 그래프를 /root/ans/inv/out/pat-graph.txt 에 저장하세요.
8. /root/ans/inv/whowins.sh 를 쓰세요. 인자를 셋 받습니다 — 인벤토리 경로 · 호스트 이름 · 변수 이름. 그 호스트가 최종적으로 갖는 값을 <변수>=<값> 한 줄로 내고, 그 변수가 정의돼 있지 않으면 표준 오류에 까닭을 적고 0 이 아닌 값으로 끝나야 합니다. 그 도구로 /root/ans/inv/out/merge-report.txt 를 네 줄로 만드세요 — dir 의 web1 의 tier, dir 의 web1 의 pool, dir 의 web2 의 region, prio/hosts.ini 의 app1 의 stack 순서입니다.
참고
- 작업 디렉터리는
/root/ans/inv입니다. 이 실습은 플레이북을 돌리지 않습니다 — 인벤토리를 해석하는 명령만 씁니다. - 세 가지 물음:
--graph는 구조를,--list는 전체를 JSON 으로,--host는 한 호스트의 최종 변수를 답합니다. - 흔한 실수: 디렉터리 안에 확장자가 붙은 인벤토리 파일을 두고 왜 안 읽히는지 몰라 헤매는 것.
- 흔한 실수: 값을 파일에서 눈으로 찾아 적는 것. 소스가 둘 이상이면 눈으로는 틀립니다.
- 흔한 실수: 패턴의 결과가 비어 있는데도 오류가 아니라서 아무 대상 없이 초록불로 끝나는 것.
- [인벤토리 만들기](https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html) · [호스트 패턴](https://docs.ansible.com/ansible/latest/inventory_guide/intro_patterns.html) · [ansible-inventory 명령](https://docs.ansible.com/ansible/latest/cli/ansible-inventory.html) · [변수 사용하기](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html) · [설정 항목 목록](https://docs.ansible.com/ansible/latest/reference_appendices/config.html)
단계 8개
- 소스를 두 개 주면 무엇이 합쳐지나
- 디렉터리를 주면 파일 이름이 순서를 정한다
- 그룹 변수와 호스트 변수가 만드는 세 층
- 인벤토리 파일 안의 그룹 변수가 가장 약하다
- 같은 깊이의 그룹은 사전순, 그것을 뒤집는 손잡이
- 자식 그룹이 부모 그룹을 이긴다
- 패턴으로 대상을 좁히고 눈으로 확인하기
- 이 변수는 결국 어느 값이 이기는가 — 도구로 만들기