고급 플레이북 문법
고급 플레이북 문법 (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
# ...
여기서 app1과 app2는 앵커 &jvm_opts와 별칭 *jvm_opts를 사용해 opts와 port 값을 공유해요. 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)" 페이지에서 이어서 배울 수 있어요.