YAML — язык разметки данных¶
YAML (сокр. от YAML Ain't Markup Language, изначально — Yet Another Markup Language) — человекочитаемый язык сериализации данных, предназначенный для обмена конфигурациями и структурированной информацией между программами. Основные черты: минимальное использование служебных символов, опора на отступы для обозначения вложенности и поддержка шести базовых типов данных (null, boolean, integer, float, string, timestamp). Файлы YAML обычно имеют расширения .yaml или .yml.
¶История создания
YAML разработан Кларком Эвансом (Clark Evans), Ингемаром Ремером (Ingy döt Net) и Ореном Бен-Кири (Oren Ben-Kiki) в 2001 году. Первая версия спецификации 1.0 вышла в мае 2004 года, версия 1.1 — в 2005-м, текущая версия 1.2 — в 2009 году. Начальное расширение аббревиатуры — Yet Another Markup Language, однако позднее авторы переосмыслили его как рекурсивное YAML Ain't Markup Language, подчёркивая, что YAML описывает данные, а не разметку документов вроде HTML или XML.
Идея создания заключалась в том, чтобы язык был максимально удобен для чтения и написания человеком при сохранении полной совместимости с существующими стандартами сериализации. YAML позиционировался как альтернатива XML, JSON и INI-файлам, сочетающая выразительность первых с простотой последнего.
¶Основные принципы
YAML построен на нескольких ключевых правилах:
- Вложенность через отступы. Уровень вложенности определяется количеством пробелов в начале строки (табуляция запрещена). Это роднит YAML с Python и отличает от JSON, где вложенность задаётся фигурными скобками.
- Ключ-значение. Основной способ задать пару — запись
ключ: значение. Колонка ставится после ключа без пробела перед ней. - Минимум синтаксических символов. Скобки, кавычки и запятые используются только там, где без них нельзя обойтись.
- Порядок сохраняется. В отличие от JSON, YAML-документы сохраняют порядок элементов, что важно для конфигураций.
¶Типы данных
Спецификация YAML 1.1 определяет восемь встроенных типов: null (представляется как null, ~ или пустое значение), boolean (true/false, yes/no, on/off), integer, float, строка, метка времени (timestamp), бинарные данные (base64) и сноска (alias). Версия 1.2 сузила набор до шести, убрав бинарные данные и сноски из обязательного списка, а также ограничив boolean значениями true и false.
¶Структуры данных
YAML поддерживает два базовых типа коллекций — последовательности (sequence) и отображения (mapping), а также скалярные значения. Последовательность записывается через дефис, отображение — через пары «ключ: значение».
Пример YAML-документа:
```yaml server: host: 192.168.1.1 port: 8080 enabled: true
users:
- name: Алексей
role: admin
- name: Мария
role: user ```
Этот же документ в JSON выглядел бы существенно объёмнее из-за изобилия скобок и кавычек. YAML допускает запись многострочных строк через блочный литерал (|) и переносимый литерал (>), что удобно для хранения длинных текстов, ключей и шаблонов.
¶Применение
YAML широко используется в инфраструктурном и DevOps-инструментарии:
- Kubernetes — манифесты объектов (поды, сервисы, деплойменты) описываются в YAML.
- Docker Compose — файл
docker-compose.ymlзадаёт сервисы, сети и тома. - Ansible — плейбуки и роли автоматизации написаны на YAML.
- CI/CD-системы — конфигурации GitLab CI, GitHub Actions, Jenkins (через плагины) используют YAML.
- Конфигурации приложений — Spring Boot, Rails, Symfony и множество других фреймворков поддерживают YAML-конфиги.
- Маршрутизаторы и сетевое оборудование — конфигурации Cisco, Juniper и других систем.
¶Критика и особенности
Несмотря на популярность, YAML подвергается критике за неоднозначность синтаксиса. Классический пример — строка yes без кавычек интерпретируется как boolean в YAML 1.1, но как строка в JSON. Похожая проблема существует с версионными номерами (например, 1.10 может быть прочитан как число 1.1) и датами. Эти ловушки приводили к инцидентам в продакшене, включая известный случай с сервисом Slack, где YAML-конфигурация с версией PostgreSQL 1.10 была автоматически приведена к 1.1.
Другое замечание — зависимость от отступов: случайный таб вместо пробела или лишний пробел ломают документ, причём ошибка может быть неочевидна. В связи с этим для машинной генерации конфигураций часто предпочитают JSON, а YAML оставляют для ручного редактирования.
¶Альтернативы
Основные конкуренты YAML — JSON (стандарт RFC 8259, более строгий и однозначный), TOML (упрощённый формат конфигураций, выбранный для Rust-экосистемы и pyproject.toml), INI-файлы (простейший формат пар «ключ=значение») и HCL (язык HashiCorp для Terraform).
¶Источники
- YAML Specification 1.2 (yaml.org)
- «YAML Ain't Markup Language» — официальный сайт проекта
- Кларк Эванс, Ингемар Ремер, Орен Бен-Кири. YAML 1.1 Specification
- Блог Kubernetes Documentation — «Configuration Best Practices»
