Spec-Zone.ru › Ansible 2.11

Синтаксис YAML

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

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

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

Основы 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

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

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

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-файлы.

Особенности

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

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

См. также

Работа с playbook-файлами

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

YAMLLint

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

GitHub examples directory

Полные файлы playbook-файлов из исходного кода проекта github

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

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

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

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

irc.freenode.net

#ansible IRC чат-канал и #yaml для вопросов, связанных с YAML

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

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

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

Для полноты, YAML 1.2 — это преемник 1.1

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

Spec-Zone.ru

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