Spec-Zone.ru › Ansible 2.10

Синтаксис 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 не слишком часто использует их, но вы также можете указать булево значение (true/false) в нескольких формах:

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

Используйте строчные «true» или «false» для булевых значений в словарях, если вы хотите быть совместимыми с параметрами yamllint по умолчанию.

Значения могут занимать несколько строк, используя | или >. Расширение на несколько строк с использованием «литерального блока скаляра» | включит новые строки и любые trailing пробелы. Использование «сложенного блока скаляра» > будет сворачивать новые строки в пробелы; это используется, чтобы сделать то, что в противном случае было бы очень длинной строкой, легче читать и редактировать. В любом случае отступ будет игнорироваться. Примеры:

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 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:"

Разница между одинарными и двойными кавычками заключается в том, что в двойных кавычках вы можете использовать escapes:

foo: "a \t TAB and a \n NEWLINE"

Список разрешенных escapes можно найти в спецификации 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"

См. также

Работа с playbooks

Узнайте, что могут делать playbooks и как их писать/выполнять.

YAMLLint

YAMLLint (онлайн) поможет вам отладить синтаксис YAML, если у вас возникли проблемы

Директория примеров GitHub

Полные файлы playbooks из исходного кода проекта GitHub

Ссылка на синтаксис YAML в Википедии

Хорошее руководство по синтаксису YAML

Список рассылки

Вопросы? Помощь? Идеи? Обратитесь к списку на Google Groups

irc.freenode.net

Канал IRC-чата #ansible и #yaml для вопросов, специфичных для YAML

Спецификация YAML 1.1

Спецификация YAML 1.1, которую в настоящее время реализуют PyYAML и libyaml

Спецификация YAML 1.2

Для полноты, 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.10/reference_appendices/YAMLSyntax.html

Spec-Zone.ru

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