Ansible Playbook - jinja2 템플릿

jinja2 템플릿

Ansible은 파이썬으로 만들어져있다.

파이썬에서 템플릿을 위해 정의된 엔진으로 jinja2라는 템플릿을 사용한다.

파이썬에서 django, flask에서 jinja2를 사용한다.

\{\%...\%\} // 제어 when,if
\{\{...\}\} // 표현
\{\#...\#\} // 주석

아래의 예제를 살펴보자.

아래의 예제는 8대의 노드에 /etc/hosts를 관리하기 위한 Playbook이다.

---
- name: Create hosts file by template
  hosts: nodes
  become: yes
  vars:
    nu: "\{\{ groups['nodes'] | count \}\}"

  tasks:
    - template:
        src: hosts.j2
        dest: /etc/hosts

hosts_template.yml

127.0.0.1 \{\{ ansilbe_hostname \}\}
192.168.1.10 ansible-server
\{\% for ip in range(nu | int) \%\}
\{\{ groups['nodes'][ip]\}\} node\{\{ groups['nodes'][ip][-3:]\}\}
\{\% endfor \%\}

hosts.j2

이렇게 jinja2 템플릿을 이용하면 코드처럼 작성이 가능하다.

jinja2 템플릿에서 for 루프는 익숙하지 않으니 자세히 살펴보자.

for문 뒤의 ip는 변수 선언이다.

in은 반복을 선언하는 구문이며, python의 in으로 생각하면 된다.

range 구문 뒤에 숫자를 넣어 해당 숫자만큼 반복한다.

nu는 모든 노드의 수를 yaml에서 계산해서 가져왔으며 해당 정수 값이 jinja2로 넘어오면서 string으로 바뀌기 때문에 nuint를 통해 int 타입으로 변환한 것을 알 수 있다.

그 다음 groups의 nodes는 ip의 실제 값을 갖으며 ip는 인덱스 값을 계산하여 치환하도록 작성된 것이다.

그 뒤의 node는 문자열이며 [-3:]의 의미는 ip의 뒤의 세자리를 가져오도록 하였다.

src에 명시된 hosts.j2를 수행하면 dest에 명시된 /etc/hosts에 jinja2 템플릿에 명시된 작업을 수행하게 된다.

즉, template은 형식을 읽어서 다른 곳으로 출력하는 것으로 이해하면 된다.

활용법에 따라 굉장히 다양하게 사용할 수 있을 것 같다.

Reference

인프런 조훈님 강의 - 앤서블을 깊이있게 활용하기



© 2022. by minkuk

Powered by minkuk