Ansible 를 위한 사용자 정의 Jinja2 필터 생성 방법

AnsibleBeginner
지금 연습하기

소개

Ansible 는 Jinja2 템플릿 엔진을 활용하여 IT 인프라를 유연하고 확장 가능하게 관리하는 강력한 자동화 도구입니다. 이 튜토리얼에서는 Ansible 플레이북의 기능을 확장하고 워크플로우를 간소화하기 위해 Ansible 에서 사용자 정의 Jinja2 필터를 만드는 방법을 배웁니다.

Ansible 에서 Jinja2 필터 이해

Jinja2 는 동적 콘텐츠 생성을 위해 Ansible 에서 사용되는 강력한 템플릿 엔진입니다. 필터는 Ansible 플레이북 내에서 데이터를 변환 및 조작할 수 있도록 하는 Jinja2 의 필수적인 부분입니다. 이 섹션에서는 Jinja2 필터의 기본 사항과 Ansible 에서 어떻게 활용될 수 있는지 살펴봅니다.

Jinja2 필터란 무엇인가요?

Jinja2 필터는 Ansible 플레이북 내의 변수 또는 표현식에 적용될 수 있는 함수입니다. 이러한 필터를 통해 입력 데이터에 대해 서식 지정, 조작 또는 데이터 변환과 같은 다양한 작업을 수행할 수 있습니다. Jinja2 는 다양한 내장 필터를 제공하며, 특정 요구 사항에 맞는 사용자 정의 필터를 만들 수도 있습니다.

Ansible 의 내장 Jinja2 필터

Ansible 은 플레이북에서 사용할 수 있는 일련의 내장 Jinja2 필터를 제공합니다. 일반적으로 사용되는 필터 중 일부는 다음과 같습니다.

  • to_json: 파이썬 데이터 구조를 JSON 문자열로 변환합니다.
  • to_yaml: 파이썬 데이터 구조를 YAML 문자열로 변환합니다.
  • regex_replace: 문자열에 정규 표현식 검색 및 바꾸기를 수행합니다.
  • default: 입력이 정의되지 않은 경우 기본값을 제공합니다.
  • join: 리스트를 문자열로 연결합니다.
  • combine: 두 개 이상의 사전을 병합합니다.

내장 Jinja2 필터의 전체 목록은 Ansible 문서에서 확인할 수 있습니다.

Ansible 플레이북에서 Jinja2 필터 적용

Ansible 플레이북에서 Jinja2 필터를 사용하려면 파이프 (|) 연산자를 사용하여 변수 또는 표현식에 적용할 수 있습니다. 예를 들어, 파이썬 사전을 JSON 문자열로 변환하려면 to_json 필터를 사용할 수 있습니다.

- name: 사전의 JSON 표현 출력
  debug:
    msg: "{{ my_dict | to_json }}"

Jinja2 필터는 입력 데이터에 여러 작업을 수행하기 위해 연결될 수 있습니다. 예를 들어, 먼저 리스트를 쉼표로 구분된 문자열로 변환한 다음 해당 문자열을 대문자로 변환할 수 있습니다.

- name: 쉼표로 구분된 대문자 리스트 출력
  debug:
    msg: "{{ my_list | join(', ') | upper }}"

Jinja2 필터의 기능을 이해함으로써 다양한 시나리오와 데이터 요구 사항에 적응할 수 있는 더욱 동적이고 강력한 Ansible 플레이북을 만들 수 있습니다.

사용자 정의 Jinja2 필터 정의

Ansible 는 다양한 내장 Jinja2 필터를 제공하지만, 특정 요구 사항을 충족하기 위해 사용자 정의 필터를 만들어야 할 때가 있습니다. Ansible 에서 사용자 정의 Jinja2 필터를 정의하면 플레이북의 기능을 확장하고 더욱 다양하게 만들 수 있습니다.

사용자 정의 Jinja2 필터 생성

Ansible 에서 사용자 정의 Jinja2 필터를 생성하려면 하나 이상의 인수를 받아 변환된 데이터를 반환하는 파이썬 함수를 정의해야 합니다. 그런 다음 이 함수를 Jinja2 필터로 등록하여 Ansible 플레이북에서 사용할 수 있도록 합니다.

여기 문자열 리스트를 쉼표로 구분된 문자열로 변환하는 사용자 정의 필터를 만드는 예제가 있습니다.

## filters/custom_filters.py
def to_comma_separated(value):
    """문자열 리스트를 쉼표로 구분된 문자열로 변환합니다."""
    return ', '.join(value)

from ansible.plugins.filter.core import FilterModule

class FilterModule(FilterModule):
    def filters(self):
        return {
            'to_comma_separated': to_comma_separated
        }

이 예제에서는 문자열 리스트를 입력으로 받아 쉼표로 구분된 문자열을 반환하는 to_comma_separated 함수를 정의합니다. 그런 다음 이 함수를 FilterModule 클래스에서 Jinja2 필터로 등록합니다.

Ansible 플레이북에서 사용자 정의 Jinja2 필터 적용

사용자 정의 Jinja2 필터를 정의한 후에는 다른 필터와 마찬가지로 Ansible 플레이북에서 사용할 수 있습니다. to_comma_separated 필터를 사용하는 예제는 다음과 같습니다.

- name: 서버 목록을 쉼표로 구분하여 출력
  debug:
    msg: "{{ groups['webservers'] | to_comma_separated }}"

이 예제에서는 to_comma_separated 필터를 사용하여 webservers 그룹의 호스트 목록을 쉼표로 구분된 문자열로 변환합니다.

사용자 정의 Jinja2 필터를 만들면 복잡한 논리를 캡슐화하고 플레이북의 가독성을 높이며 Ansible 코드를 더욱 유지 관리 가능하고 재사용 가능하게 만들 수 있습니다.

Ansible 플레이북에 사용자 정의 필터 통합

이제 사용자 정의 Jinja2 필터를 정의하는 방법을 배웠으므로 이제 Ansible 플레이북에 통합하는 방법을 살펴보겠습니다. 이 섹션에서는 Ansible 코드에서 사용자 정의 필터를 사용하는 방법을 안내합니다.

Ansible 에서 사용자 정의 필터 로드

Ansible 플레이북에서 사용자 정의 Jinja2 필터를 사용하려면 Ansible 이 필터를 찾아 로드할 수 있도록 해야 합니다. Ansible 은 다음 위치에서 사용자 정의 필터를 검색합니다.

  1. 플레이북 파일을 기준으로 filters/ 디렉터리
  2. 플레이북 파일을 기준으로 library/ 디렉터리
  3. ANSIBLE_FILTER_PLUGINS 환경 변수에 지정된 디렉터리

filters/custom_filters.py 파일에 사용자 정의 to_comma_separated 필터를 생성했다고 가정합니다. 이 필터를 플레이북에서 사용하려면 플레이북 시작 부분에 다음 코드를 추가할 수 있습니다.

---
- hosts: all
  gather_facts: false

  vars:
    webservers: ["web01", "web02", "web03"]

  tasks:
    - name: 사용자 정의 필터 로드
      ansible.builtin.include_vars:
        file: filters/custom_filters.py
        name: custom_filters

    - name: 웹서버 목록을 쉼표로 구분하여 출력
      debug:
        msg: "{{ webservers | to_comma_separated }}"

이 예제에서는 custom_filters.py 파일을 include_vars 모듈을 사용하여 로드합니다. 이 파일에는 사용자 정의 to_comma_separated 필터가 포함되어 있습니다. 필터가 로드되면 플레이북 작업에서 사용할 수 있습니다.

사용자 정의 필터 구성

Ansible 프로젝트가 커짐에 따라 사용자 정의 필터를 별도의 파일이나 디렉터리로 구성하는 것이 유용할 수 있습니다. 이렇게 하면 코드를 깨끗하고 유지 관리하기 쉽게 유지할 수 있습니다.

예를 들어, Ansible 프로젝트에 filters/ 디렉터리를 만들고 사용자 정의 필터 파일을 여기에 넣을 수 있습니다. 그런 다음 이전 예제와 같이 include_vars 모듈을 사용하여 필터를 로드할 수 있습니다.

my-ansible-project/
├── filters/
│   └── custom_filters.py
├── playbooks/
│   └── my-playbook.yml
└── inventory/
    └── hosts

이러한 방식으로 사용자 정의 필터를 구성하면 여러 플레이북에서 쉽게 재사용할 수 있으며 Ansible 코드가 모듈적이고 확장 가능하게 유지됩니다.

Ansible 플레이북에 사용자 정의 Jinja2 필터를 효과적으로 통합하는 핵심은 Ansible 이 필터를 올바르게 찾아 로드할 수 있도록 하는 것입니다. 이 섹션에 설명된 모범 사례를 따르면 특정 요구 사항에 맞는 더욱 강력하고 유연한 Ansible 플레이북을 만들 수 있습니다.

요약

이 튜토리얼을 마치면 Ansible 플레이북에 사용자 정의 Jinja2 필터를 정의하고 통합하는 방법에 대한 확실한 이해를 얻게 될 것입니다. 이 지식은 Ansible 기반 자동화 프로세스의 가독성, 유지 관리성 및 효율성을 향상시켜 더욱 숙련된 Ansible 사용자가 될 수 있도록 지원합니다.