YAML: конфигурационные файлы без беспорядка
Почему YAML стал стандартом для конфигурационных файлов и как избежать его подводных камней.
Каждый Kubernetes манифест. Каждый GitHub Actions workflow. Каждый Docker Compose файл.
YAML везде для конфигурации. Он читаем, гибок и имеет некоторые неожиданные особенности.
Почему YAML?
JSON строгий: двойные кавычки, без комментариев, без запятых в конце.
YAML прощающий: минимальный синтаксис, комментарии разрешены, человеко-читаемый.
# YAML конфигурация
database:
host: localhost
port: 5432
name: myapp
{
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
Те же данные, меньше шума в YAML.
Основы
Пары ключ-значение:
name: John
age: 30
Вложенные структуры (используй пробелы, а не табы):
person:
name: John
age: 30
Списки:
colors:
- red
- green
- blue
Встроенные списки и объекты:
colors: [red, green, blue]
person: {name: John, age: 30}
Проблема Норвегии
country: NO
Что такое NO? Булево false. YAML интерпретирует NO, Yes, on, off и другие как булевы значения.
Код страны Норвегии становится false. Твоя конфигурация ломается загадочными способами.
Исправление: Заключи в кавычки строки, которые могут быть интерпретированы как булевы.
country: "NO"
Проблема многострочных строк
description: This is a long
description that continues
Это две строки или одна с отступом "that continues"? Зависит от YAML-парсера.
Явные многострочные:
# Буквальный (сохраняет переносы строк)
description: |
Line one
Line two
# Свёрнутый (объединяет строки)
description: >
This is one long
line when parsed
Отступы важны
Два пробела. Не табы. Не один пробел. Не три.
# Правильно
parent:
child: value
# Неправильно - символ табуляции
parent:
child: value
Смешивание табов и пробелов ломает YAML молча. Настрой свой редактор использовать пробелы.
Интерпретация чисел
version: 1.10
Это строка "1.10" или число 1.1? Большинство парсеров интерпретируют как 1.1.
Математика с плавающей точкой снова. Заключай номера версий в кавычки.
version: "1.10"
Якоря и псевдонимы
YAML может ссылаться на повторяющийся контент:
defaults: &defaults
timeout: 30
retries: 3
production:
<<: *defaults
timeout: 60
Мощно для уменьшения дублирования. Запутанно, когда переборщено.
Валидация YAML
Гибкость YAML означает, что многое, что выглядит валидным, таковым не является.
- Используй линтер в своём редакторе
- Валидируй против схемы, когда возможно
- Конвертируй в JSON, чтобы увидеть, что парсер фактически интерпретировал
Если твоя конфигурация не работает, проверь, что видит парсер, а не что ты написал.
YAML vs JSON vs TOML
YAML: Человеко-читаемый, много возможностей, причудливые крайние случаи.
JSON: Строгий, простой, широко поддерживаемый, многословный.
TOML: Явный, меньше сюрпризов, набирает популярность для конфигов.
Для данных машина-машина JSON безопаснее. Для редактируемых людьми конфигов YAML работает, если ты знаешь подводные камни.
YAML приоритизирует читаемость над строгостью. Этот компромисс создаёт крайние случаи. Заключай в кавычки строки, которые выглядят как булевы или числа, используй явный многострочный синтаксис и валидируй перед развёртыванием.