LabHub
배우기 러닝패스 코스

Ansible Fundamentals

Variable Precedence and Working With Facts

LabHub 에서 이어서 보기

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

목표

값을 코드에서 분리해 여러 자리에 배치하고, 그중 무엇이 이기는지 직접 확인합니다. 팩트와 register 로 실행 중에 얻은 값도 다룹니다.

왜 중요한가

"변수를 바꿨는데 반영이 안 된다"는 질문의 답은 거의 언제나 우선순위입니다. Ansible 은 같은 이름의 변수를 여러 자리에서 받아들이고, 충돌해도 오류를 내지 않고 조용히 더 센 쪽을 씁니다. 이 성질은 편리하지만 디버깅을 어렵게 만듭니다. 그래서 덮어써도 되는 값은 약한 자리(롤의 defaults)에, 반드시 지켜야 할 값은 강한 자리에 두는 설계 감각이 필요합니다. 명령줄 -e 는 무엇이든 이기지만 어디에도 기록되지 않으므로, 장애 대응에서 썼다면 반드시 코드로 되돌려 놔야 합니다. 그러지 않으면 다음 배포가 조용히 그 값을 지웁니다.

단계

  1. /root/ans/vars/site.yml 을 만들고 플레이 vars:app_name: checkout 을 정의하세요. 그 값을 /root/ans/vars/out/app_name.txt 에 쓰세요.
  2. /root/ans/vars/vars/common.ymlapp_port: 9090 을 두고 vars_files 로 읽어 들이세요. 값을 /root/ans/vars/out/app_port.txt 에 쓰세요.
  3. /root/ans/inventory/group_vars/web.ymlnode_role: frontend 를, /root/ans/inventory/host_vars/web1.ymlnode_role: canary 를 두세요. 두 디렉터리는 첫 실습에서 만든 /root/ans/inventory/hosts.ini 와 같은 자리에 있어야 자동으로 읽힙니다. web2 에서는 frontend 로, web1 에서는 canary 로 보여야 합니다.
  4. 명령을 실행하고 register 로 결과를 받은 뒤, 표준 출력만 /root/ans/vars/out/uptime.txt 에 저장하세요.
  5. gather_facts 를 켜고 수집된 팩트 중 호스트 이름·아키텍처·시스템을 담은 JSON 을 /root/ans/vars/out/facts.json 으로 저장하세요.
  6. -e app_port=9999 로 실행해 그 값을 /root/ans/vars/out/precedence.txt 에 저장하세요. 2번에서 만든 app_port.txt 는 9090 그대로여야 합니다.
  7. set_factapp_nameapp_port 를 이어 붙인 값을 만들어 /root/ans/vars/out/endpoint.txtcheckout:9090 형태로 저장하세요.
  8. /root/ans/vars/out/summary.json 을 만드세요. app(=checkout), port(=9090), role(web1 의 호스트 변수 값), host(수집한 팩트의 호스트 이름) 네 키를 가져야 합니다.

참고

플레이 변수 정의하고 쓰기

/root/ans/vars/site.yml 을 만들고 플레이 vars:app_name: checkout 을 정의하세요. 그 값을 /root/ans/vars/out/app_name.txt 에 쓰세요.

플레이의 vars: 아래에 값을 두고, copy 모듈의 content 에서 Jinja2 로 참조하세요.

변수 파일 분리하기

/root/ans/vars/vars/common.ymlapp_port: 9090 을 두고 vars_files 로 읽어 들이세요. 값을 /root/ans/vars/out/app_port.txt 에 쓰세요.

vars_files: 는 경로 목록입니다. 값이 늘어나면 플레이에서 떼어 내는 것이 관례입니다.

그룹 변수와 호스트 변수 만들기

/root/ans/inventory/group_vars/web.ymlnode_role: frontend 를, /root/ans/inventory/host_vars/web1.ymlnode_role: canary 를 두세요. 두 디렉터리는 첫 실습에서 만든 /root/ans/inventory/hosts.ini 와 같은 자리에 있어야 자동으로 읽힙니다. web2 에서는 frontend 로, web1 에서는 canary 로 보여야 합니다.

디렉터리 이름이 곧 규칙입니다. group_vars 아래 파일 이름은 그룹 이름, host_vars 아래는 호스트 이름입니다.

명령 결과를 변수에 담기

명령을 실행하고 register 로 결과를 받은 뒤, 표준 출력만 /root/ans/vars/out/uptime.txt 에 저장하세요.

register 로 받은 것은 객체입니다. 파일에는 그중 표준 출력만 넣으세요.

팩트 수집해 JSON 으로 남기기

gather_facts 를 켜고 수집된 팩트 중 호스트 이름·아키텍처·시스템을 담은 JSON 을 /root/ans/vars/out/facts.json 으로 저장하세요.

gather_facts 를 켜고 ansible_facts 의 일부를 골라 JSON 으로 씁니다. to_nice_json 필터가 도움이 됩니다.

명령줄 변수로 덮어쓰기

-e app_port=9999 로 실행해 그 값을 /root/ans/vars/out/precedence.txt 에 저장하세요. 2번에서 만든 app_port.txt 는 9090 그대로여야 합니다.

-e 로 넘긴 값이 가장 셉니다. 앞 단계에서 저장한 파일은 덮어쓰지 말고 다른 이름으로 남기세요.

set_fact 로 값 조합하기

set_factapp_nameapp_port 를 이어 붙인 값을 만들어 /root/ans/vars/out/endpoint.txtcheckout:9090 형태로 저장하세요.

두 변수를 이어 붙인 새 값을 만들어 파일에 씁니다. 형식은 이름:포트 입니다.

변수·팩트·호스트 변수를 합친 요약 만들기

/root/ans/vars/out/summary.json 을 만드세요. app(=checkout), port(=9090), role(web1 의 호스트 변수 값), host(수집한 팩트의 호스트 이름) 네 키를 가져야 합니다.

네 개의 키(app, port, role, host)를 가진 JSON 을 만듭니다. role 은 web1 의 호스트 변수, host 는 수집한 팩트에서 옵니다.