LabHub
배우기 러닝패스 코스

Ansible実戦

変数の優先順位を文書ではなく測定で立てる

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

같은 이름의 변수를 열두 자리에 한 자리씩 심어 가며 무엇이 이기는지 직접 재고, 그 결과를 팀이 읽을 수 있는 순위 표로 남길 수 있게 됩니다.

왜 중요한가

"분명히 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.ymlsvc_tier: role-defaultsprobe_out 을 두고, tasks/main.ymlWINNER={{ 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.ymlinv-all, group_vars/web.ymlinv-web, host_vars/web2.ymlinv-hostsvc_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.ymlsvc_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.ymlsvc_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_factsvc_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.ymlbase_limitssvc_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.jsonreplaced·combined 두 키로 남기고, 열두 자리의 측정 결과를 /root/ans/prec/out/rank.md 에 표로 적으세요.

참고

바닥 자리 - 롤 기본값

/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.ymlsvc_tier: role-defaultsprobe_out 을 두고, tasks/main.ymlWINNER={{ 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.ymlinv-all, group_vars/web.ymlinv-web, host_vars/web2.ymlinv-hostsvc_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.ymlsvc_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.ymlsvc_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_factsvc_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.ymlbase_limitssvc_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.jsonreplaced·combined 두 키로 남기고, 열두 자리의 측정 결과를 /root/ans/prec/out/rank.md 에 표로 적으세요.

명령줄 값이 정말 이기는지 보려면 플레이 안에 다른 자리들도 남겨 두어야 합니다. 표는 낮은 자리부터 한 줄씩, 각 줄에 그 자리에서 측정된 값을 적으세요 - 앞 단계의 산출물이 근거입니다.