Spec-Zone.ru › Ansible 2.8

Синтаксис YAML

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

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

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

Основы YAML

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

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

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

---
# A list of tasty 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}
['Apple', 'Orange', 'Strawberry', 'Mango']

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

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

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

Этого достаточно, чтобы начать писать Ansible playbooks.

Особенности

Хотя вы можете поместить практически что угодно в необрамённый скаляр, есть некоторые исключения. Двоеточие, за которым следует пробел (или новая строка) ": " является индикатором отображения. Пробел, за которым следует знак фунта " #" начинает комментарий.

Из-за этого следующее приведёт к ошибке синтаксиса 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 в разделе «Последовательности эскейпов» (YAML 1.1) или «Символы эскейпа» (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"

См. также

Работа с playbooks
Узнайте, что могут делать playbooks и как их писать/запускать.
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.8/reference_appendices/YAMLSyntax.html

Spec-Zone.ru

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