YAML 문법
YAML 문법 (YAML Syntax)
Ansible 플레이북은 사실 YAML이라는 데이터 형식으로 표현돼요. XML이나 JSON보다 사람이 읽고 쓰기 쉽고, 대부분의 프로그래밍 언어에 YAML을 다루는 라이브러리가 있기 때문이죠. 이 페이지에서는 올바른 YAML 문법의 기본을 정리해요.
출처: 문서
본문
이 페이지는 Ansible 플레이북(우리의 설정 관리 언어)이 어떻게 표현되는지, 올바른 YAML 문법의 기초 개념을 다뤄요. YAML을 쓰는 이유는 XML이나 JSON 같은 다른 흔한 데이터 형식보다 사람이 읽고 쓰기 쉽기 때문이에요. 게다가 대부분의 프로그래밍 언어에는 YAML을 다루는 라이브러리가 있어요.
실제로 어떻게 쓰이는지 보려면 '플레이북 다루기(Working with playbooks)' 문서를 함께 읽어도 좋아요.
YAML 기초
Ansible에서 거의 모든 YAML 파일은 목록(list)으로 시작해요. 목록의 각 항목은 또 다시 키/값 쌍의 목록, 흔히 '해시(hash)'나 '사전(dictionary)'이라고 부르는 형태예요. 그래서 YAML에서 목록과 사전을 쓰는 방법을 알아야 해요.
YAML에는 또 하나의 특징이 있어요. 모든 YAML 파일은(Ansible과 관계없이) 선택적으로 ---로 시작하고 ...로 끝날 수 있어요. 이것은 YAML 형식의 일부이며 문서의 시작과 끝을 나타내요.
목록의 모든 구성원은 같은 들여쓰기 수준에서 "-"(하이픈과 공백)로 시작하는 줄이에요.
---
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
...
사전(dictionary)은 단순한 key:value 형태로 표현돼요(콜론 뒤에는 반드시 공백이 와야 해요).
# An employee record
martin:
name: Martin D'vloper
job: Developer
skill: Elite
이보다 복잡한 구조도 가능해요. 사전의 목록, 값이 목록인 사전, 또는 둘의 혼합 같은 형태요.
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
사전과 목록은 정말 원한다면 축약형으로도 표현할 수 있어요.
---
martin: {name: Martin D'vloper, job: Developer, skill: Elite}
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']
이런 형태를 '플로우 컬렉션(Flow collections)'이라고 불러요.
Ansible이 이 형태를 많이 쓰지는 않지만, 불리언 값(true/false)도 여러 형태로 지정할 수 있어요.
create_key: true
needs_agent: false
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
기본 yamllint 옵션과 호환되도록 하고 싶다면 사전의 불리언 값에는 소문자 true나 false를 쓰세요.
값은 |나 >를 써서 여러 줄에 걸칠 수 있어요. '리터럴 블록 스칼라(Literal Block Scalar)' |로 줄을 넘기면 줄바꿈과 뒤쪽 공백이 그대로 포함돼요. '폴디드 블록 스칼라(Folded Block Scalar)' >로 넘기면 줄바꿈이 공백으로 접혀서, 원래는 아주 긴 한 줄이 되어 버릴 텍스트를 읽고 편집하기 쉽게 만들어줘요. 두 경우 모두 들여쓰기는 무시돼요. 예시는 다음과 같아요.
include_newlines: |
exactly as you see
will appear these three
lines of poetry
fold_newlines: >
this is really a
single line of text
despite appearances
위 > 예시에서는 모든 줄바꿈이 공백으로 접히지만, 줄바꿈을 유지하도록 강제하는 방법이 두 가지 있어요.
fold_some_newlines: >
a
b
c
d
e
f
또는 줄바꿈 \n 문자를 포함해서 강제할 수도 있어요.
fold_same_newlines: "a b\nc d\n e\nf\n"
지금까지 배운 것을 임의의 YAML 예시로 조합해 볼게요. 이것은 Ansible과는 전혀 관계가 없지만 형식 감을 잡는 데 도움이 돼요.
---
# An employee record
name: Martin D'vloper
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
perl: Elite
python: Elite
pascal: Lame
education: |
4 GCSEs
3 A-Levels
BSc in the Internet of Things
Ansible 플레이북을 쓰기 시작하는 데 필요한 YAML 지식은 이 정도면 충분해요.
주의사항 (Gotchas)
따옴표로 묶지 않은 스칼라에는 거의 무엇이든 넣을 수 있지만, 몇 가지 예외가 있어요. 콜론 뒤에 공백(또는 줄바꿈)이 오는 ":"는 매핑을 나타내는 표시자예요. 공백 뒤에 오는 파운드 기호 "#"는 주석을 시작해요.
그래서 다음은 YAML 문법 오류가 돼요.
foo: somebody said I should put a colon here: so I did
windows_drive: c:
…하지만 이건 동작해요.
windows_path: c:\windows
공백이 뒤따르는 콜론이나 줄 끝에 오는 콜론을 포함한 해시 값은 따옴표로 감싸는 게 좋아요.
foo: 'somebody said I should put a colon here: so I did'
windows_drive: 'c:'
…그러면 콜론이 그대로 보존돼요.
다르게는 큰따옴표를 쓸 수도 있어요.
foo: "somebody said I should put a colon here: so I did"
windows_drive: "c:"
작은따옴표와 큰따옴표의 차이는, 큰따옴표 안에서는 이스케이프를 쓸 수 있다는 점이에요.
foo: "a \t TAB and a \n NEWLINE"
허용되는 이스케이프 목록은 YAML 명세의 'Escape Sequences'(YAML 1.1) 또는 'Escape Characters'(YAML 1.2)에서 찾을 수 있어요.
다음은 잘못된 YAML이에요.
foo: "an escaped \' single quote"
또한 Ansible은 변수에 "{{ var }}"를 사용해요. 콜론 뒤의 값이 {로 시작하면 YAML은 그것을 사전으로 여겨요. 그래서 이렇게 따옴표로 감싸야 해요.
foo: "{{ variable }}"
값이 따옴표로 시작하면 값 전체를 따옴표로 감싸야 해요. 일부만 감싸면 안 돼요. 올바르게 따옴표를 쓰는 추가 예시는 다음과 같아요.
foo: "{{ variable }}/additional/string/literal"
foo2: "{{ variable }}\\backslashes\\are\\also\\special\\characters"
foo3: "even if it is just a string literal it must all be quoted"
유효하지 않은 예시:
foo: "E:\\path\\"rest\\of\\path
'와 " 외에도 특수(또는 예약) 문자로 취급되어 따옴표 없는 스칼라의 첫 글자로 쓸 수 없는 문자들이 있어요: []{}>|*&!%#`@,.
?:-에도 주의해야 해요. YAML에서는 문자열의 시작에 비공백 문자가 뒤따르면 허용되지만, YAML 처리기 구현마다 다르므로 따옴표를 쓰는 게 더 안전해요.
플로우 컬렉션에서는 규칙이 조금 더 엄격해요.
a scalar in block mapping: this } is [ all , valid
flow mapping: { key: "you { should [ use , quotes here" }
불리언 변환은 유용하지만, 리터럴 yes나 다른 불리언 값을 문자열로 쓰고 싶을 때는 문제가 될 수 있어요. 그런 경우에는 그냥 따옴표를 쓰세요.
non_boolean: "yes"
other_string: "False"
YAML은 1.0 같은 특정 문자열을 부동소수점 값으로 변환해요. 버전 번호를 지정해야 한다면(예: requirements.yml 파일에서), 값이 부동소수점처럼 보이면 따옴표로 감싸야 해요.
version: "1.0"
더 알아보기 (Learn more)
- 플레이북이 무엇을 할 수 있고 어떻게 쓰고 실행하는지는 플레이북 다루기 문서를 확인해요.
- YAML 문법 디버깅에는 YAML Lint(온라인)가 도움이 돼요.
- YAML 문법의 좋은 참고 자료로는 Wikipedia의 YAML syntax reference가 있어요.
- PyYAML과 libyaml이 구현 중인 YAML 1.1 명세, 그리고 그 후속인 YAML 1.2 명세도 참고해요.