고급 플레이북 문법

고급 플레이북 문법 (Advanced playbook syntax)

이 페이지의 고급 YAML 문법 예시는 Ansible이 사용하는 YAML 파일에 담는 데이터를 더 세밀하게 제어할 수 있게 해줘요. 템플릿팅을 막아야 하는 안전하지 않은 문자열, 그리고 여러 곳에서 변숫값을 공유하는 YAML 앵커와 별칭을 중심으로 살펴봅니다.

출처: 문서

본문

이 페이지의 고급 YAML 문법 예시는 Ansible이 사용하는 YAML 파일에 담을 데이터를 더 세밀하게 제어할 수 있게 해줘요. Python 특유의 YAML에 대한 추가 정보는 공식 PyYAML 문서(공식 PyYAML Documentation)에서 확인할 수 있습니다.

안전하지 않거나(unsafe) 원시 문자열 (Unsafe or raw strings)

lookup 플러그인이 반환하는 값을 다룰 때 Ansible은 unsafe라는 데이터 타입을 사용해 템플릿팅을 차단해요. 데이터를 unsafe로 표시하면 악의적인 사용자가 Jinja2 템플릿을 남용해 대상 머신에서 임의의 코드를 실행하는 것을 막을 수 있습니다. Ansible의 구현은 unsafe 값이 절대 템플릿팅되지 않도록 보장하며, 이는 Jinja2를 {% raw %} ... {% endraw %} 태그로 이스케이프하는 것보다 더 포괄적입니다.

같은 unsafe 데이터 타입을 직접 정의하는 변수에도 사용해 템플릿팅 오류와 정보 노출을 막을 수 있어요. vars_prompts로 공급되는 값을 unsafe로 표시할 수도 있고, 플레이북에서도 unsafe를 사용할 수 있습니다. 가장 흔한 사용 사례는 {% 같은 특수 문자를 허용하는 비밀번호, 그리고 템플릿처럼 보이지만 템플릿팅되면 안 되는 JSON 인자입니다. 예를 들면:

---
mypassword: !unsafe 234%234{435lkj{{lkjsdf

플레이북에서는 이렇게 씁니다:

---
hosts: all
vars:
  my_unsafe_variable: !unsafe 'unsafe % value'
tasks:
    ...

해시나 배열 같은 복합 변수의 경우 개별 요소에 !unsafe를 사용하세요:

---
my_unsafe_array:
  - !unsafe 'unsafe element'
  - 'safe element'

my_unsafe_hash:
  unsafe_key: !unsafe 'unsafe value'

YAML 앵커와 별칭: 변숫값 공유하기 (YAML anchors and aliases)

YAML 앵커와 별칭은 공유 변숫값을 정의하고, 유지보수하고, 유연하게 사용하는 데 도움을 줘요. &로 앵커를 정의하고, *로 표기하는 별칭으로 참조합니다. 세 개의 값을 앵커로 설정하고, 그중 두 개는 별칭으로 사용하고, 나머지 하나는 재정의하는 예시는 다음과 같습니다:

---
# ...
vars:
  app1:
    jvm: &jvm_opts
      opts: '-Xms1G -Xmx2G'
      port: 1000
      path: /usr/lib/app1
  app2:
    jvm:
      <<: *jvm_opts
      path: /usr/lib/app2
# ...

여기서 app1app2는 앵커 &jvm_opts와 별칭 *jvm_opts를 사용해 optsport 값을 공유해요. path 값은 <<(merge 연산자)로 병합됩니다.

앵커와 별칭을 사용하면 중첩 변수를 포함한 복잡한 변숫값 집합도 공유할 수 있어요. 어떤 변숫값이 다른 변숫값을 포함할 때, 두 값을 따로 정의할 수 있지만:

vars:
  webapp_version: 1.0
  webapp_custom_name: ToDo_App-1.0

이 방식은 비효율적이고 규모가 커질수록 유지보수가 늘어나요. 버전 값을 이름에 포함하려면 app_version에 앵커를, custom_name에 별칭을 사용하면 됩니다:

vars:
  webapp:
      version: &my_version 1.0
      custom_name:
          - "ToDo_App"
          - *my_version

이제 custom_name 값 안에서 app_version 값을 재사용하고, 그 결과를 템플릿에서 사용할 수 있어요:

---
- name: Using values nested inside dictionary
  hosts: localhost
  vars:
    webapp:
      version: &my_version 1.0
      custom_name:
        - "ToDo_App"
        - *my_version
  tasks:
  - name: Using Anchor value
    ansible.builtin.debug:
      msg: My app is called "{{ webapp.custom_name | join('-') }}".

version 값을 &my_version 앵커로 고정한 뒤 *my_version 별칭으로 재사용했어요. 앵커와 별칭을 사용하면 딕셔너리 안의 중첩 값에 접근할 수 있습니다.

더 보기 (See also)

  • 변수 사용 — 변수에 대한 모든 것.
  • 데이터 다루기 — Ansible에서 복잡한 데이터 조작하기.
  • 커뮤니케이션 — 질문이나 도움이 필요하거나 아이디어를 나누고 싶다면 Ansible 커뮤니케이션 안내서를 참고하세요.

더 알아보기 (Learn more)

  • 고급 문법의 실제 활용은 "데이터 다루기(complex_data_manipulation)"와 "변수 사용(playbooks_variables)" 페이지에서 이어서 배울 수 있어요.