템플릿 처리

템플릿 처리 (Jinja2)

Ansible은 Jinja2 템플릿을 써서 동적인 표현식과 변수·팩트 접근을 가능하게 해요. 구성 파일용 템플릿을 하나 만들어 여러 환경에 배포하고, 환경마다 올바른 데이터(IP 주소, 호스트명, 버전)를 넣어줄 수 있어요. 플레이북 안에서 작업 이름을 비롯한 여러 부분에도 바로 템플릿을 쓸 수 있고, Jinja2에 포함된 표준 필터와 테스트도 모두 사용할 수 있어요.

중요한 점은 모든 템플릿 처리(templating)가 작업을 대상 머신으로 보내 실행하기 전에 Ansible 컨트롤 노드에서 일어난다는 거예요. 덕분에 대상 머신에는 패키지 요구사항이 최소화되고(jinja2는 컨트롤 노드에만 필요), Ansible이 대상 머신으로 넘기는 데이터 양도 줄어들어요. 컨트롤 노드에서 템플릿을 파싱해 각 작업에 필요한 정보만 대상 머신에 전달하죠. 참고로 템플릿 모듈이 쓰는 파일과 데이터는 반드시 utf-8로 인코딩돼 있어야 해요.

출처: 문서

본문

Jinja2 예시

이 예시에서는 서버의 호스트명을 자기 자신의 /tmp/hostname 파일에 써 넣으려고 해요. 디렉터리 구조는 이렇게 생겼어요.

├── hostname.yml
├── templates
│   └── test.j2

hostname.yml 파일은 다음과 같아요.

---
- name: Write hostname
  hosts: all
  tasks:
    - name: write hostname using jinja2
      ansible.builtin.template:
        src: templates/test.j2
        dest: /tmp/hostname

test.j2 파일에는 이렇게 써 있어요.

My name is {{ ansible_facts['hostname'] }}

template 모듈이 test.j2를 렌더링할 때 {{ ansible_facts['hostname'] }} 자리에 실제 호스트명을 넣어 주는 거죠. 이렇게 하면 대상 머신마다 알맞은 값이 들어간 파일 하나를 각자 만들어 줍니다.

더 알아보기 (Learn more)

  • Ansible playbooks — 플레이북에 대한 소개
  • Playbook tips — 플레이북 사용 팁과 요령
  • Jinja2 Docs — 템플릿의 문법과 의미를 다루는 Jinja2 공식 문서
  • Ansible communication guide — 질문이나 도움이 필요하면 방문할 수 있는 안내