[Ansible] YAML Syntax
YAML Syntax
ㅁ Ansible 플레이북 (Configuration Management Language) 표현 방식으로 사용된다.
ㅁ YAML는 XML이나 JSON과 같은 다른 일반적인 데이터 형식보다 사람이 읽고 쓰기가 쉽다.
ㅁ YAML 작업을 위해 대부분의 프로그래밍 언어로 제공되는 라이브러리가 있다.
YAML Basics
ㅁ Ansible의 경우 거의 모든 YAML 파일이 목록(list)으로 시작한다.
ㅁ 목록(list)의 각 항목은 일반적으로 "hash" or "dictionary"이라고 하는 key/value 쌍의 목록이다.
ㅁ YAML 형식의 문서의 시작(---)과 끝(...)을 나타낸다.
ㅁ 목록(list)의 대시(-) 공백으로 시작하는 동일한 들여 쓰기를 해야한다.
---
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
...
ㅁ dictionary는 간단한 key:value 형식으로 표현된다.
ㅁ 콜론(:) 뒤에 공백이 있어야 한다.
# An employee record
martin:
name: Martin D'vloper
job: Developer
skill: Elite
ㅁ 사전(dictionary), 목록(list)의 조합과 같이 더 복잡한 데이터 구조가 가능하다.
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
ㅁ 사전(dictionary), 목록(list)의 약어로 표현이 가능하다.
---
martin: {name: Martin D'vloper, job: Developer, skill: Elite}
['Apple', 'Orange', 'Strawberry', 'Mango']
ㅁ 부울 값(true/false)로 지정이 가능하다.
create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: 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
same_as: "a b\nc d\n e\nf\n"
ㅁ Ansible Playbook을 작성하려면 YAML을 알아야 한다.
# 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
Gotchas
ㅁ 인용되지 않은 스칼라에는 어떤 것이든 넣을 수 있지만, 몇 가지 예외가 있다.
ㅁ 공백(또는 새로운 줄) 뒤에 오는 콜론(:)은 매핑을 위한 지시자다.
ㅁ 파운드 기호 "#" 뒤에 오는 공백이 코멘트를 시작한다.
ㅁ 이 때문에 다음과 같은 경우 YAML 구문 오류가 발생한다.
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: "somebody said I should put a colon here: so I did"
windows_drive: "c:"
ㅁ 작은 따옴표와 큰 따옴표의 차이점은 큰 따옴표에서 이스케이프를 사용할 수 있다는 것이다.
foo: "a \t TAB and a \n NEWLINE"
ㅁ 허용 된 이스케이프 목록은 YAML 사양의 "이스케이프 시퀀스"(YAML 1.1) 또는 "이스케이프 문자"(YAML 1.2)에 있다. ㅁ 다음은 잘못된 YAML입니다.
foo: "an escaped \' single quote"
ㅁ Ansible은 변수에 "{{var}}"를 사용한다.
ㅁ 콜론 뒤의 값이 "{"로 시작하면 YAML은 이를 사전(dictionary)이라고 생각하므로 다음과 같이 처리해야 한다.
foo: "{{ variable }}/additional/string/literal"
foo2: "{{ variable }}\\backslashes\\are\\also\\special\\characters"
foo3: "even if it's 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"
출처: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html