Spec-Zone.ru › Ansible 2.5

Синтаксис YAML

Эта страница предоставляет краткий обзор правильного синтаксиса YAML, который используется для выражения playbooks Ansible (нашего языка управления конфигурацией).

Мы используем YAML, потому что его легче читать и писать, чем другие распространённые форматы данных, такие как XML или JSON. Кроме того, существуют библиотеки для работы с YAML на большинстве языков программирования.

Вы также можете прочитать Работа с playbook одновременно, чтобы увидеть, как это используется на практике.

Основы YAML

Практически каждый файл YAML для Ansible начинается со списка. Каждый элемент списка представляет собой список пар ключ-значение, обычно называемый «хэш» или «словарём». Поэтому нам нужно знать, как писать списки и словари в YAML.

Существует ещё одна небольшая особенность YAML. Все файлы YAML (независимо от их связи с Ansible или нет) могут необязательно начинаться с --- и заканчиваться .... Это часть формата YAML и указывает начало и конец документа.

Все члены списка находятся на одной и той же отступе, начиная со строки с "- " (дефис и пробел):

---
# A list of tasty fruits
fruits:
    - Apple
    - Orange
    - Strawberry
    - Mango
...

Словарь представлен в простом 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']

Они называются «Коллекциями потоков».

Ansible не очень часто использует их, но вы также можете указать значение булева типа (true/false) в нескольких формах:

create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false

Значения могут занимать несколько строк, используя | или >. Использование «Литерального блочного скаляра» | сохранит все новые строки и все последующие пробелы. Использование «Свёрнутого блочного скаляра» > свёрнёт все новые строки в пробелы; используется для того, чтобы сделать очень длинную строку легче для чтения и редактирования. В любом случае отступ будет проигнорирован. Вот примеры:

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"

Давайте объединим то, что мы узнали до сих пор, в произвольном примере 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

Это всё, что вам нужно знать о YAML, чтобы начать писать Ansible playbook.

Особенности

Хотя вы можете поместить практически что угодно в необработанный скаляр, есть некоторые исключения. Двоеточие, за которым следует пробел (или новая строка) : `` is an indicator for a mapping. A space followed by the pound sign `` # начинает комментарий.

Из-за этого следующее приведёт к ошибке синтаксиса 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'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"

См. также

Работа с playbook
Узнайте, что могут делать playbook и как их писать/выполнять.
YAMLLint
YAMLLint (онлайн) помогает отладить синтаксис YAML, если у вас возникли проблемы
Github examples directory
Полные файлы playbook из исходного кода проекта github
Wikipedia YAML syntax reference
Хорошее руководство по синтаксису YAML
Mailing List
Вопросы? Помощь? Идеи? Зайдите на список на Google Groups
irc.freenode.net
#ansible IRC-чат-канал и #yaml для вопросов, специфичных для YAML
YAML 1.1 Specification
Спецификация для YAML 1.1, которую в настоящее время реализуют PyYAML и libyaml
YAML 1.2 Specification
Для полноты, YAML 1.2 является преемником 1.1

© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.5/reference_appendices/YAMLSyntax.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API