YAML (YAML Ain't Markup Language) - это формат сериализации [1] данных, который используется для представления структурированных данных в человекочитаемом формате. Считается, что в отличие от таких форматов, как JSON или XML, YAML - это более простая и интуитивно понятная структура. Также важно отметить, что YAML в отличие от многих других форматов не является языком разметки, а предназначен для предоставления данных в структурированном виде.
[1]: Cериализация - это процесс преобразования сложных структур данных в форму, пригодную для сохранения или передачи.
Основы синтаксиса YAML
Одной из ключевых особенностей YAML является использование пробелов вместо специальных символов для формирования структур данных.
В YAML ключи и значения разделяются двоеточием, сами пары ключ-значение отделяются переносом строки. Списки представляются с использованием дефиса, а вложенные структуры данных создаются с помощью отступов.
Комментарии в YAML начинаются с символа решетки #
и могут использоваться для пояснения структуры данных или для временного исключения части информации.
Какие типы узлов поддерживает YAML
Формат YAML в основном использует 3 типа узлов:
Maps/Dictionaries - называют отображениями (mappings) Содержимое узла отображения представляет собой неупорядоченный набор пар ключ/значение, с одним ограничением, что каждый из ключей является уникальным.
Arrays/Lists - называют последовательностями (sequences) Содержимое узла последовательности представляет собой упорядоченную серию узлов. Тут последовательность может содержать один и тот же узел более одного раза, и даже саму себя.
Literals - содержат данные типа строки, числа, булевы значения и т.д
Например, курсы программирования Code-basics используют описанные выше узлы для описания структуры урока следующим образом:
name: Название урока
theory: |
Здесь текст урока
instructions: описание практического задания
tips:
- cсылка 1
- ссылка 2
defintions:
- name: определение 1
description: описание определения 1
- name: определение 2
description: описание определения 2
Рассмотрим более подробно эту структуру и остановимся на каждом виде узла:
Отступы
Для создания вложенной структуры используются пробелы, каждый следующий уровень содержит отступ на 2 пробела больше, чем предыдущий. Очень важно понимать, что tab
использовать нельзя, это должны быть именно пробелы.
defintions: # уровень вложенности 1
- name: определение 1 # уровень вложенности 2, 2 пробела в качестве
description: описание определения 1 # уровень вложенности 2, 2 пробела в качестве
Отображения (mappings)
Отображения используются, чтобы соединить пары ключ-значение.
name: Условная конструкция (if) # mapping
theory: Условные конструкции позволяют... # mapping
Последовательности (sequences)
Последовательности формируются с использованием дефиса -
и пробела. Здесь важно помнить, что они упорядоченные и могут быть вложены с использованием отступов.
name: Название урока
theory: |
Здесь текст урока
instructions: описание практического задания
tips:
# последовательность
- cсылка 1
- ссылка 2
defintions:
# последовательность
- name: определение 1
description: описание определения 1
- name: определение 2
description: описание определения 2
Литералы (literals)
В качестве литералов могут использоваться такие типы данных как строки, цифры, и булевы значения.
name: John Doe # string
age: 25 # number
isStudent: True # bolean
Обратите внимание, что строковые литералы не требуют наличия кавычек. Но они могут пригодиться в случае, если текст содержит какие-либо специальные символы, которые могут быть интерпретированы неверно. Например:
message1: Hexlet & partners # возникает ошибка, так как & является спец символом
message2: "Hexlet & partners" # здесь все в порядке, потому что есть кавычки
Если значением ключа является текстовый блок, например, из нескольких строк, то можно воспользоваться |
(pipe character), который сообщает, что следующий текст надо интерпретировать как блок строк:
message: |
это сообщение
состоит
из нескольких
строк
Сферы применения
Благодаря своей простоте и гибкости YAML находит применение в различных областях разработки программного обеспечения и интеграции систем:
- Файлы конфигурации: YAML используется для создания конфигурационных файлов приложений и сервисов. Он позволяет легко описывать параметры конфигурации, настройки и свойства, используемые при развертывании и настройке приложений.
- Сериализация данных: YAML служит форматом для сериализации и десериализации структур данных, и используется для обмена данными между различными системами или компонентами, что обеспечивает простоту взаимодействия.
- Спецификации API: YAML часто используется для определения спецификаций и документации API, например, OpenAPI. Он обеспечивает краткий и понятный способ определения конечных точек, схем запросов/ответов и других деталей, связанных с API.
- Инфраструктура как код (IaC): YAML часто используется для описания конфигураций инфраструктуры. Например, он используется в плейбуках Anisble для описания задач, которые необходимо выполнить на удаленных хостах; в файлах Docker Compose для определения и управления много контейнерными приложениями; в файлах конфигурации Terraform. YAML позволяет декларативно определять ресурсы инфраструктуры и их конфигурации.
- Управление тестированием и конфигурацией: YAML используется в средах тестирования и инструментах для определения тестовых примеров, тестовых данных и тестовых конфигураций.
Заключение
YAML - мощный и удобный инструмент для представления структурированных данных. Благодаря своей простоте и интуитивно понятном синтаксисе его можно легко читать и писать, что делает его подходящим для различных случаев использования.
В контексте IaC (Инфраструктура как код) YAML позволяет декларативно определять ресурсы инфраструктуры и их конфигурации, что упрощает управление инфраструктурой и автоматизирует развертывание.