-
[Ansible] YAML SyntaxDevOps/Ansible 2020. 2. 29. 20:26
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
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] List 변수를 다른 구분자로 변환 (0) 2020.03.04 [Ansible] Playbook Keyword (v 2.9) (0) 2020.03.04 [Ansible] Playbook Style Guide (0) 2020.01.21