DevOps/Ansible

[Ansible] YAML Syntax

`작은거인` 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