[Ansible] 앤서블 Jinja2 필터 사용법

[Ansible] 앤서블 Jinja2 필터 사용법

안녕하세요? 정리하는 개발자 워니즈 입니다. 필자가 갑자기 Ansible을 너무 재밌게 하고 있어서 당분간 Ansible 연재를 계속 할 것 같습니다. 지난시간까지는 간단한 playbook 사용법에 대해서 알아봤는데요. 이번시간에는 데이터 변경작업에 대한 이야기를 해보려고 합니다.

Ansible은 보면 템플릿을 잘 활용해야되는데요. 그안에서 데이터를 적절히 조작해서 필요한 작업을 진행할 수 있습니다.

Jinja2 필터는 템플릿에서 데이터를 어떤 형태에서 다른 형태로 바꾸는 작업입니다. 이미 많은 내장 함수를 가지고 있습니다. 이런 필터 기능은 로컬 데이터를 다루는 Ansible의 컨트롤러에서 수행되는 것이며 타겟 머신의 태스크에서 이루어 지는 것이 아닙니다.

1. 기본 예제

  • 데이터 포맷을 위한 필터

어떤 결과를 다른 형태로 변경하는 것입니다. 디버깅을 할 때 유용한 경우가 있습니다.

또는 사람이 읽기 쉬운 형태로 출력을 합니다.

파이썬의 pprint 모듈처럼 indent를 줄 수도 있습니다. (버전 2.2 이후)

이제는 반대로 이미 포맷된 것에서 읽어 오는 경우도 있습니다.

예시

  • 어떤 변수가 정의되어야만 하도록 강제함

어떤 변수가 정의되어 있지 않다면 ansible의 ansible.cfg에 정의되어 있는 디폴트 행동을 따르게 되어 있는데 이를 끌 수 있습니다.다음은 그 기능이 꺼지고 꼭 해당 변수가 존재하는지 체크하도록 하는 것입니다.

만약 해당 변수가 정의되어 있지 않다면 템플릿이 동작하면서 오류가 발생합니다.

  • 정의 되지 않은 변수의 디폴트 값 정의

Jinja2 는 default 필터를 제공하는데 해당 변수가 정의되지 않을 경우 디폴트 값을 갖게 됩니다.

  • 정의되지 않은 변수와 패러미터의 생략

버전 1.8 부터 omit이라는 특별 변수를 사용하여 변수나 모듈 패러미터를 생략하기위한 디폴트 필터를 사용할 수 있습니다.

파일경로 path가 3개 있는데 앞에 2개는 시스템에서 제공하는 umask에 따라 touch 되고 마지막 파일경로 /tmp/baz 는 시스템 디폴트 umask와 상관없이 0444 로 설정됩니다.

2. 데이터 필터

  • List 필터

버전 1.8 이후.

  • 집합(SET) 필터

버전 1.4 이후.

  • 랜덤 필터

버전 1.6 이후.

  • Math 필터

버전 1.9 이후.

  • IP 주소 필터

버전 1.9 이후.

더 자세한 ipaddr 기능은 Jinja2 ipaddr() 필터를 참조하십시오.

  • 유용한 필터

3. Jinja2 테스트 관련 필터

Jinja2의 테스트는 템플릿을 돌려 True 또는 False 결과를 리턴하는가를 보고 판단합니다. Jinja2의 내장 테스트 문서를 참조합니다. 테스트 하는 것은 필터를 이용하는 것과 동일하지만 C(map()) 또는 C(select()) 와 같이 목록에서 항목을 선택하는 것과 같은 목록 처리 필터에도 사용될 수 있습니다.

필터와 마찬가지로 테스트도 로컬 데이터를 테스트하는 Ansible 컨트롤러에서 수행되며, 원격 대상 태스크에서 수행되지는 않습니다.

3-1. 문자열 테스트

match는 전체 문자열에 대한 매치를 하는 반면 search는 부분 매치를 합니다.

3-2. 그룹 포함 테스트

어떤 그룹이 다른 그룹의 서브셑 또는 수퍼셑 인가를 체크하기 위한 issubset, issuperset 필터가 있습니다.

3-3. 경로 테스트

3-4. 태스트 결과 테스트

4. 마치며

이번시간에는 앤서블의 Jinja2 필터 사용법에 대해서 알아봤습니다. 대부분의 playbook 예시에서 Jinja2 필터는 상당히 많이 사용되고 있습니다. 기존에 개발자가 코딩으로 만들던 부분을 내장함수를 통해서 손쉽게 데이터를 변환하고 조작할 수 있기에 유용합니다.

다음 이시간에는 조건식/반복문 에 대해서 정리해보도록 하겠습니다.

워니즈 블로그
워니즈 깃헙

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다