템플릿에서의 Python3

템플릿에서의 Python3 (Python3 in templates)

Ansible은 템플릿과 변수에서 Python의 데이터 타입과 표준 함수를 활용하기 위해 Jinja2를 사용해요. 이 데이터 타입과 표준 함수를 쓰면 데이터에 대해 다양한 연산을 할 수 있는데, 템플릿을 쓸 때는 Python 버전 간 차이를 반드시 알고 있어야 해요. 이 페이지는 Python2와 Python3 양쪽에서 동작하는 템플릿을 설계하는 데 도움을 주는 내용이에요.

출처: 문서

본문

Ansible은 템플릿과 변수에서 Python의 데이터 타입과 표준 함수를 활용하기 위해 Jinja2를 사용해요. 이 데이터 타입과 표준 함수들을 쓰면 데이터에 대해 풍부한 연산을 수행할 수 있어요. 다만 템플릿을 사용할 때는 Python 버전 간의 차이를 반드시 인지해야 해요.

이 내용들은 Python2와 Python3 양쪽에서 동작하는 템플릿을 설계하는 데 도움을 줘요. Python2에서 Python3로 업그레이드하려는 경우에도 도움이 될 거예요. Python2 안에서, 또는 Python3 안에서의 업그레이드는 보통 Jinja2 템플릿에 영향을 주는 변화를 만들지 않아요.

사전 뷰 (Dictionary views)

Python2에서 dict.keys(), dict.values(), dict.items() 메서드는 리스트를 반환해요. Jinja2는 그것을 Ansible이 다시 리스트로 바꿀 수 있는 문자열 표현으로 넘겨줘요.

Python3에서 이 메서드들은 dictionary view 객체를 반환해요. Jinja2가 dictionary view에 대해 반환하는 문자열 표현은 Ansible이 다시 리스트로 파싱할 수 없어요. 하지만 dict.keys(), dict.values(), dict.items()를 쓸 때마다 list 필터를 사용하면 쉽게 호환 가능하게 만들 수 있어요.

vars:
  hosts:
    testhost1: 127.0.0.2
    testhost2: 127.0.0.3
tasks:
  - debug:
      msg: '{{ item }}'
    # Only works with Python 2
    #loop: "{{ hosts.keys() }}"
    # Works with both Python 2 and Python 3
    loop: "{{ hosts.keys() | list }}"

dict.iteritems()

Python2 사전은 iterkeys(), itervalues(), iteritems() 메서드를 가져요.

Python3 사전에는 이 메서드들이 없어요. dict.keys(), dict.values(), dict.items()를 사용해서 플레이북과 템플릿이 Python2와 Python3 양쪽과 호환되게 만드세요.

vars:
  hosts:
    testhost1: 127.0.0.2
    testhost2: 127.0.0.3
tasks:
  - debug:
      msg: '{{ item }}'
    # Only works with Python 2
    #loop: "{{ hosts.iteritems() }}"
    # Works with both Python 2 and Python 3
    loop: "{{ hosts.items() | list }}"

참고: 여기서 list 필터가 왜 필요한지에 대한 설명은 '사전 뷰(Dictionary views)' 항목을 참고하세요.

더 알아보기 (Learn more)