ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible] YAML Syntax
    DevOps/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

    댓글

작은거인's Blog / Designed by TISTORY