LabHub
배우기 러닝패스 코스

Ansible実戦

Jinja2で設定ファイルを生成する

LabHub 에서 이어서 보기

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

목표

환경마다 다른 설정 파일을 하나의 템플릿과 데이터로 분해하고, 렌더링 결과가 깔끔하고 검증된 상태로 배치되게 만듭니다.

왜 중요한가

설정 파일을 환경 수만큼 두면 그 파일들은 반드시 서로 달라집니다. 템플릿은 "틀은 하나, 데이터는 여럿"으로 그 분기를 없앱니다. 실무에서 템플릿을 망치는 것은 문법이 아니라 두 가지입니다. 하나는 공백 — 제어 구문이 남긴 빈 줄이 YAML 설정을 깨뜨립니다. 다른 하나는 매번 달라지는 렌더링 결과 — 타임스탬프 한 줄 때문에 파일이 매 실행마다 바뀌고, 핸들러가 매번 돌아 서비스가 매번 재시작됩니다. 마지막으로 validate 는 잘못된 설정이 서비스를 죽이는 경로를 막는 가장 싼 안전장치입니다. 자동 배포를 켜는 순간 이 옵션은 선택이 아닙니다.

단계

  1. 이 실습의 플레이북은 /root/ans/tpl/site.yml 하나를 씁니다. /root/ans/tpl/templates/basic.j2/root/ans/tpl/out/basic.conf 를 만드세요. 결과에 service = checkout 줄이 있어야 합니다.
  2. /root/ans/tpl/templates/filters.j2/root/ans/tpl/out/filters.conf 를 만드세요. UPPER=CHECKOUT, TIMEOUT=30(정의되지 않은 변수의 기본값), REPLICAS=3 세 줄이 나와야 합니다.
  3. /root/ans/tpl/templates/upstream.j2/root/ans/tpl/out/upstream.conf 를 만드세요. 백엔드 3개가 server 10.0.0.11:8080; 형태로 각각 한 줄씩 나와야 합니다.
  4. 같은 템플릿을 다른 변수로 렌더링해 /root/ans/tpl/out/prod.conf(tls = on, debug 없음)와 /root/ans/tpl/out/dev.conf(tls = off, debug 있음)를 만드세요.
  5. upstream.conf 에 빈 줄이 하나도 없고 server 줄 앞에 불필요한 들여쓰기가 없게 공백을 제어하세요. {%- -%} 를 쓰거나 /root/ans/tpl/site.ymltemplate 태스크에 trim_blocks/lstrip_blocks 를 켜면 됩니다.
  6. /root/ans/tpl/templates/node.j2/root/ans/tpl/out/node.conf 를 만드세요. hostname, arch 는 팩트에서, generated_forinventory_hostname(=web1)에서 옵니다.
  7. /root/ans/tpl/site.ymltemplate 태스크에 validatebackup: true 를 붙여 /root/ans/tpl/out/validated.conf 를 만드세요. 내용은 key=value 한 줄입니다.
  8. /root/ans/tpl/out/site.nginx 를 만드세요. upstream checkout_backend { 블록 안에 4칸 들여쓴 server 줄 3개, 그리고 listen 8080;server_name checkout.labhub.internal; 이 각각 4칸 들여쓰기로 들어갑니다. 빈 줄은 1줄 이하여야 합니다.

참고

변수를 넣은 기본 템플릿 렌더링

이 실습의 플레이북은 /root/ans/tpl/site.yml 하나를 씁니다. /root/ans/tpl/templates/basic.j2/root/ans/tpl/out/basic.conf 를 만드세요. 결과에 service = checkout 줄이 있어야 합니다.

{{ 변수 }} 로 값을 출력합니다. 결과에 Jinja2 구문이 남아 있으면 렌더링이 안 된 것입니다.

upper 와 default 필터 쓰기

/root/ans/tpl/templates/filters.j2/root/ans/tpl/out/filters.conf 를 만드세요. UPPER=CHECKOUT, TIMEOUT=30(정의되지 않은 변수의 기본값), REPLICAS=3 세 줄이 나와야 합니다.

필터는 파이프로 잇습니다. 정의되지 않은 변수에 기본값을 주는 필터가 무엇인지 생각해 보세요.

리스트를 도는 반복 넣기

/root/ans/tpl/templates/upstream.j2/root/ans/tpl/out/upstream.conf 를 만드세요. 백엔드 3개가 server 10.0.0.11:8080; 형태로 각각 한 줄씩 나와야 합니다.

{% for %}{% endfor %} 사이에 반복할 줄을 둡니다. 백엔드 3개가 각각 한 줄이 되어야 합니다.

환경에 따라 다른 설정 내보내기

같은 템플릿을 다른 변수로 렌더링해 /root/ans/tpl/out/prod.conf(tls = on, debug 없음)와 /root/ans/tpl/out/dev.conf(tls = off, debug 있음)를 만드세요.

같은 템플릿을 다른 변수로 두 번 렌더링합니다. prod 에는 debug 가 나오면 안 됩니다.

공백 제어로 빈 줄 없애기

upstream.conf 에 빈 줄이 하나도 없고 server 줄 앞에 불필요한 들여쓰기가 없게 공백을 제어하세요. {%- -%} 를 쓰거나 /root/ans/tpl/site.ymltemplate 태스크에 trim_blocks/lstrip_blocks 를 켜면 됩니다.

{%- / -%} 또는 template 모듈의 trim_blocks/lstrip_blocks 를 쓰세요. 결과에 빈 줄이 하나도 없어야 합니다.

팩트와 inventory_hostname 쓰기

/root/ans/tpl/templates/node.j2/root/ans/tpl/out/node.conf 를 만드세요. hostname, arch 는 팩트에서, generated_forinventory_hostname(=web1)에서 옵니다.

팩트 변수는 ansible_ 로 시작합니다. 대상 이름은 inventory_hostname 입니다.

validate 와 backup 붙이기

/root/ans/tpl/site.ymltemplate 태스크에 validatebackup: true 를 붙여 /root/ans/tpl/out/validated.conf 를 만드세요. 내용은 key=value 한 줄입니다.

validate 는 %s 자리에 임시 파일 경로가 들어갑니다. 검사에 실패하면 배치되지 않습니다.

그룹 변수로 nginx 설정 통째로 만들기

/root/ans/tpl/out/site.nginx 를 만드세요. upstream checkout_backend { 블록 안에 4칸 들여쓴 server 줄 3개, 그리고 listen 8080;server_name checkout.labhub.internal; 이 각각 4칸 들여쓰기로 들어갑니다. 빈 줄은 1줄 이하여야 합니다.

upstream 블록 안의 server 줄은 4칸 들여쓰기입니다. 공백 제어와 반복을 함께 써야 합니다.