0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>YAML - это язык сериализации данных для записи структурированной информации в человекочитаемом виде. Обычно используется в файлах с расширениями .yml и .yaml. YAML подходит для конфигураций, описания инфраструктуры и обмена данными между системами, когда важны компактность и читаемость.</p>
1
<p>YAML - это язык сериализации данных для записи структурированной информации в человекочитаемом виде. Обычно используется в файлах с расширениями .yml и .yaml. YAML подходит для конфигураций, описания инфраструктуры и обмена данными между системами, когда важны компактность и читаемость.</p>
2
<p>Название начиналось как "Yet Another Markup Language", но трактовка закрепилась как "YAML Ain’t Markup Language". Это подчеркивает отличие от разметки: YAML описывает данные, а не внешний вид документа. Формат основан на идее "минимум символов, максимум структуры", поэтому ключевую роль играют отступы и переносы строк.</p>
2
<p>Название начиналось как "Yet Another Markup Language", но трактовка закрепилась как "YAML Ain’t Markup Language". Это подчеркивает отличие от разметки: YAML описывает данные, а не внешний вид документа. Формат основан на идее "минимум символов, максимум структуры", поэтому ключевую роль играют отступы и переносы строк.</p>
3
<h2>Где применяют YAML</h2>
3
<h2>Где применяют YAML</h2>
4
<p>YAML часто выбирают в задачах DevOps и виртуализации, потому что он удобен для декларативных описаний. Типовые сценарии:</p>
4
<p>YAML часто выбирают в задачах DevOps и виртуализации, потому что он удобен для декларативных описаний. Типовые сценарии:</p>
5
<ul><li><p>конфигурации приложений, агентов и сервисов;</p>
5
<ul><li><p>конфигурации приложений, агентов и сервисов;</p>
6
</li>
6
</li>
7
<li><p>IaC-подход: параметры окружений, ресурсов и связей между ними;</p>
7
<li><p>IaC-подход: параметры окружений, ресурсов и связей между ними;</p>
8
</li>
8
</li>
9
<li><p>автоматизация развертывания и управления (пайплайны, джобы, политики);</p>
9
<li><p>автоматизация развертывания и управления (пайплайны, джобы, политики);</p>
10
</li>
10
</li>
11
<li><p>описание контейнерных композиций и оркестрации;</p>
11
<li><p>описание контейнерных композиций и оркестрации;</p>
12
</li>
12
</li>
13
<li><p>шаблоны параметров для повторяющихся сред (dev/stage/prod).</p>
13
<li><p>шаблоны параметров для повторяющихся сред (dev/stage/prod).</p>
14
</li>
14
</li>
15
</ul><p>Файл YAML обычно читается инструментом, который преобразует его в структуры данных (словарь, список, скаляры). Далее эти структуры управляют сборкой, запуском и настройкой компонентов. В большинстве процессов YAML не "выполняется", а интерпретируется как описание желаемого состояния.</p>
15
</ul><p>Файл YAML обычно читается инструментом, который преобразует его в структуры данных (словарь, список, скаляры). Далее эти структуры управляют сборкой, запуском и настройкой компонентов. В большинстве процессов YAML не "выполняется", а интерпретируется как описание желаемого состояния.</p>
16
<h2>YAML, JSON и XML: различия</h2>
16
<h2>YAML, JSON и XML: различия</h2>
17
<p>YAML, JSON и XML решают похожую задачу - хранение и передачу структурированных данных. Отличаются синтаксисом, расширяемостью и удобством сопровождения.</p>
17
<p>YAML, JSON и XML решают похожую задачу - хранение и передачу структурированных данных. Отличаются синтаксисом, расширяемостью и удобством сопровождения.</p>
18
<h3>YAML</h3>
18
<h3>YAML</h3>
19
<p>Ключевые свойства:</p>
19
<p>Ключевые свойства:</p>
20
<ul><li><p>высокая читаемость за счет отступов и малого числа служебных символов;</p>
20
<ul><li><p>высокая читаемость за счет отступов и малого числа служебных символов;</p>
21
</li>
21
</li>
22
<li><p>поддержка комментариев;</p>
22
<li><p>поддержка комментариев;</p>
23
</li>
23
</li>
24
<li><p>строки могут быть без кавычек;</p>
24
<li><p>строки могут быть без кавычек;</p>
25
</li>
25
</li>
26
<li><p>блочный и потоковый стили записи;</p>
26
<li><p>блочный и потоковый стили записи;</p>
27
</li>
27
</li>
28
<li><p>механизмы повторного использования данных (якоря, merge);</p>
28
<li><p>механизмы повторного использования данных (якоря, merge);</p>
29
</li>
29
</li>
30
<li><p>возможность хранить несколько документов в одном файле.</p>
30
<li><p>возможность хранить несколько документов в одном файле.</p>
31
</li>
31
</li>
32
</ul><p>Типичное применение: конфигурации и декларативные описания, которые регулярно читают и правят люди. В синтаксисе допускается запись чистого JSON, что упрощает миграции.</p>
32
</ul><p>Типичное применение: конфигурации и декларативные описания, которые регулярно читают и правят люди. В синтаксисе допускается запись чистого JSON, что упрощает миграции.</p>
33
<h3>JSON</h3>
33
<h3>JSON</h3>
34
<p>Ключевые свойства:</p>
34
<p>Ключевые свойства:</p>
35
<ul><li><p>строгий синтаксис и единый стиль записи;</p>
35
<ul><li><p>строгий синтаксис и единый стиль записи;</p>
36
</li>
36
</li>
37
<li><p>обязательные кавычки вокруг строк и ключей;</p>
37
<li><p>обязательные кавычки вокруг строк и ключей;</p>
38
</li>
38
</li>
39
<li><p>нет комментариев в стандарте;</p>
39
<li><p>нет комментариев в стандарте;</p>
40
</li>
40
</li>
41
<li><p>оптимален для сериализации и передачи по HTTP API;</p>
41
<li><p>оптимален для сериализации и передачи по HTTP API;</p>
42
</li>
42
</li>
43
<li><p>легко валидируется и обрабатывается в большинстве языков.</p>
43
<li><p>легко валидируется и обрабатывается в большинстве языков.</p>
44
</li>
44
</li>
45
</ul><p>Типичное применение: обмен данными между сервисами и клиентами.</p>
45
</ul><p>Типичное применение: обмен данными между сервисами и клиентами.</p>
46
<h3>XML</h3>
46
<h3>XML</h3>
47
<p>Ключевые свойства:</p>
47
<p>Ключевые свойства:</p>
48
<ul><li><p>теговая модель и вложенные элементы;</p>
48
<ul><li><p>теговая модель и вложенные элементы;</p>
49
</li>
49
</li>
50
<li><p>атрибуты, пространства имен, схемы и расширенные правила валидации;</p>
50
<li><p>атрибуты, пространства имен, схемы и расширенные правила валидации;</p>
51
</li>
51
</li>
52
<li><p>громоздкий формат и низкая компактность;</p>
52
<li><p>громоздкий формат и низкая компактность;</p>
53
</li>
53
</li>
54
<li><p>удобен для документов со сложной метамоделью и строгими контрактами.</p>
54
<li><p>удобен для документов со сложной метамоделью и строгими контрактами.</p>
55
</li>
55
</li>
56
</ul><p>Типичное применение: интеграции, где важны формальные схемы и совместимость со стандартами.</p>
56
</ul><p>Типичное применение: интеграции, где важны формальные схемы и совместимость со стандартами.</p>
57
<h2>Характерные возможности YAML</h2>
57
<h2>Характерные возможности YAML</h2>
58
<h3>Несколько документов в одном файле</h3>
58
<h3>Несколько документов в одном файле</h3>
59
<p>YAML допускает хранение набора документов внутри одного файла. Документы разделяются маркером ---; завершение документа можно обозначить ... (используется редко).</p>
59
<p>YAML допускает хранение набора документов внутри одного файла. Документы разделяются маркером ---; завершение документа можно обозначить ... (используется редко).</p>
60
<h3>Комментарии</h3>
60
<h3>Комментарии</h3>
61
<p>Комментарий начинается с # и действует до конца строки.</p>
61
<p>Комментарий начинается с # и действует до конца строки.</p>
62
<h3>Отступы как основа структуры</h3>
62
<h3>Отступы как основа структуры</h3>
63
<p>Иерархия задается пробелами. Табуляция нежелательна. Ошибка в отступе меняет дерево данных, а значит и поведение системы. Для командной работы важны единые правила форматирования и автоматическая проверка.</p>
63
<p>Иерархия задается пробелами. Табуляция нежелательна. Ошибка в отступе меняет дерево данных, а значит и поведение системы. Для командной работы важны единые правила форматирования и автоматическая проверка.</p>
64
<h3>Повторное использование данных</h3>
64
<h3>Повторное использование данных</h3>
65
<p>Якоря и alias-ссылки позволяют вынести общий блок и подключать его в нескольких местах. Это снижает дублирование и риск рассинхронизации параметров.</p>
65
<p>Якоря и alias-ссылки позволяют вынести общий блок и подключать его в нескольких местах. Это снижает дублирование и риск рассинхронизации параметров.</p>
66
<h3>Явная и неявная типизация</h3>
66
<h3>Явная и неявная типизация</h3>
67
<p>Парсер может вывести тип по значению, либо тип задается явно через тег. Явное указание полезно, когда значение должно остаться строкой.</p>
67
<p>Парсер может вывести тип по значению, либо тип задается явно через тег. Явное указание полезно, когда значение должно остаться строкой.</p>
68
<h3>Без встроенного выполнения кода</h3>
68
<h3>Без встроенного выполнения кода</h3>
69
<p>YAML не содержит механизма запуска команд. Риски обычно связаны с небезопасной десериализацией, когда парсер разрешает произвольные теги и конструирование объектов. В прикладных системах используют безопасные режимы загрузки и ограничивают набор допустимых типов.</p>
69
<p>YAML не содержит механизма запуска команд. Риски обычно связаны с небезопасной десериализацией, когда парсер разрешает произвольные теги и конструирование объектов. В прикладных системах используют безопасные режимы загрузки и ограничивают набор допустимых типов.</p>
70
<h3>Нюансы совместимости и интерпретации</h3>
70
<h3>Нюансы совместимости и интерпретации</h3>
71
<p>Разные реализации могут по-разному трактовать спорные значения. Частые источники ошибок:</p>
71
<p>Разные реализации могут по-разному трактовать спорные значения. Частые источники ошибок:</p>
72
<ul><li><p>булевы слова yes/no, on/off в старых режимах могут распознаваться как boolean;</p>
72
<ul><li><p>булевы слова yes/no, on/off в старых режимах могут распознаваться как boolean;</p>
73
</li>
73
</li>
74
<li><p>числа с ведущим нулем могут быть приняты за восьмеричные в некоторых парсерах;</p>
74
<li><p>числа с ведущим нулем могут быть приняты за восьмеричные в некоторых парсерах;</p>
75
</li>
75
</li>
76
<li><p>даты без кавычек могут стать timestamp-типом;</p>
76
<li><p>даты без кавычек могут стать timestamp-типом;</p>
77
</li>
77
</li>
78
<li><p>значение null может задаваться как null, ~ или пустое значение после двоеточия.</p>
78
<li><p>значение null может задаваться как null, ~ или пустое значение после двоеточия.</p>
79
</li>
79
</li>
80
</ul><p>Для таких полей применяют кавычки или явные теги, чтобы поведение было предсказуемым.</p>
80
</ul><p>Для таких полей применяют кавычки или явные теги, чтобы поведение было предсказуемым.</p>
81
<h2>Синтаксис YAML</h2>
81
<h2>Синтаксис YAML</h2>
82
<p>YAML оперирует маппингами (словарями), последовательностями (списками) и скалярами (одиночными значениями). Эти три формы комбинируются для построения любых вложенных структур.</p>
82
<p>YAML оперирует маппингами (словарями), последовательностями (списками) и скалярами (одиночными значениями). Эти три формы комбинируются для построения любых вложенных структур.</p>
83
<h3>Пары "ключ: значение"</h3>
83
<h3>Пары "ключ: значение"</h3>
84
<p>Базовая конструкция - ключ и связанное значение. Между ключом и двоеточием пробелы не ставят, после двоеточия обычно ставят один пробел.</p>
84
<p>Базовая конструкция - ключ и связанное значение. Между ключом и двоеточием пробелы не ставят, после двоеточия обычно ставят один пробел.</p>
85
<h3>Скалярные типы</h3>
85
<h3>Скалярные типы</h3>
86
<p>Чаще всего применяются:</p>
86
<p>Чаще всего применяются:</p>
87
<ul><li><p>int и float, включая экспоненциальную запись;</p>
87
<ul><li><p>int и float, включая экспоненциальную запись;</p>
88
</li>
88
</li>
89
<li><p>boolean (true/false);</p>
89
<li><p>boolean (true/false);</p>
90
</li>
90
</li>
91
<li><p>string;</p>
91
<li><p>string;</p>
92
</li>
92
</li>
93
<li><p>null;</p>
93
<li><p>null;</p>
94
</li>
94
</li>
95
<li><p>специальные значения (.inf, -.inf, .nan).</p>
95
<li><p>специальные значения (.inf, -.inf, .nan).</p>
96
</li>
96
</li>
97
</ul><p>Пример:</p>
97
</ul><p>Пример:</p>
98
<h3>Строки</h3>
98
<h3>Строки</h3>
99
<p>Строки допускаются без кавычек, но кавычки обязательны при двоеточиях, решетках и ведущих пробелах. Для многострочных значений используют блочные литералы:</p>
99
<p>Строки допускаются без кавычек, но кавычки обязательны при двоеточиях, решетках и ведущих пробелах. Для многострочных значений используют блочные литералы:</p>
100
<ul><li><p>| сохраняет переносы строк;</p>
100
<ul><li><p>| сохраняет переносы строк;</p>
101
</li>
101
</li>
102
<li><p>> сворачивает переносы в пробелы.</p>
102
<li><p>> сворачивает переносы в пробелы.</p>
103
</li>
103
</li>
104
</ul><p>В блоковых строках важны отступы. Блок относится к ключу, пока сохраняется единый уровень отступа.</p>
104
</ul><p>В блоковых строках важны отступы. Блок относится к ключу, пока сохраняется единый уровень отступа.</p>
105
<h3>Последовательности</h3>
105
<h3>Последовательности</h3>
106
<p>Список задается через дефисы или в квадратных скобках. Элементы могут быть скалярами или объектами.</p>
106
<p>Список задается через дефисы или в квадратных скобках. Элементы могут быть скалярами или объектами.</p>
107
<h3>Маппинги и вложенные структуры</h3>
107
<h3>Маппинги и вложенные структуры</h3>
108
<p>Маппинг группирует пары ключ-значение. Вложение задается отступами. Один и тот же ключ в пределах маппинга не должен повторяться.</p>
108
<p>Маппинг группирует пары ключ-значение. Вложение задается отступами. Один и тот же ключ в пределах маппинга не должен повторяться.</p>
109
<h3>Сложные ключи и специальные символы</h3>
109
<h3>Сложные ключи и специальные символы</h3>
110
<p>Ключом может быть строка с пробелами и символами. Тогда используют кавычки. Для коротких структур подходит потоковый стиль.</p>
110
<p>Ключом может быть строка с пробелами и символами. Тогда используют кавычки. Для коротких структур подходит потоковый стиль.</p>
111
<h3>Якоря, alias и объединение (merge)</h3>
111
<h3>Якоря, alias и объединение (merge)</h3>
112
<p>Якорь помечает фрагмент данных, alias-ссылка обращается к нему, а merge (<<) объединяет маппинги.</p>
112
<p>Якорь помечает фрагмент данных, alias-ссылка обращается к нему, а merge (<<) объединяет маппинги.</p>
113
<h2>Шаблоны конфигураций</h2>
113
<h2>Шаблоны конфигураций</h2>
114
<p>В конфигурациях якоря часто играют роль шаблонов. Типовые шаблоны:</p>
114
<p>В конфигурациях якоря часто играют роль шаблонов. Типовые шаблоны:</p>
115
<ul><li><p>базовые лимиты ресурсов и таймауты;</p>
115
<ul><li><p>базовые лимиты ресурсов и таймауты;</p>
116
</li>
116
</li>
117
<li><p>общие переменные окружения;</p>
117
<li><p>общие переменные окружения;</p>
118
</li>
118
</li>
119
<li><p>одинаковые политики логирования;</p>
119
<li><p>одинаковые политики логирования;</p>
120
</li>
120
</li>
121
<li><p>наборы меток и аннотаций для сервисов.</p>
121
<li><p>наборы меток и аннотаций для сервисов.</p>
122
</li>
122
</li>
123
</ul><p>Изменение шаблона меняет все блоки, которые его подключают, без ручного копирования.</p>
123
</ul><p>Изменение шаблона меняет все блоки, которые его подключают, без ручного копирования.</p>
124
<h2>Интеграция с инструментами</h2>
124
<h2>Интеграция с инструментами</h2>
125
<h3>Docker Compose</h3>
125
<h3>Docker Compose</h3>
126
<p>Docker Compose читает docker-compose.yml и поднимает набор сервисов, сетей и томов. YAML описывает контейнеры, порты, переменные и зависимости.</p>
126
<p>Docker Compose читает docker-compose.yml и поднимает набор сервисов, сетей и томов. YAML описывает контейнеры, порты, переменные и зависимости.</p>
127
<h3>Ansible</h3>
127
<h3>Ansible</h3>
128
<p>Ansible описывает задачи в playbook-файлах .yml. YAML задает хосты, параметры и шаги. Каждый шаг - это структура данных, которую Ansible сопоставляет модулю и аргументам.</p>
128
<p>Ansible описывает задачи в playbook-файлах .yml. YAML задает хосты, параметры и шаги. Каждый шаг - это структура данных, которую Ansible сопоставляет модулю и аргументам.</p>
129
<h2>Расширенные формы записи</h2>
129
<h2>Расширенные формы записи</h2>
130
<p>YAML поддерживает комбинации блочного и потокового стилей, а также многострочные элементы внутри списков и словарей.</p>
130
<p>YAML поддерживает комбинации блочного и потокового стилей, а также многострочные элементы внутри списков и словарей.</p>
131
<h2>Ограничения и типовые ошибки</h2>
131
<h2>Ограничения и типовые ошибки</h2>
132
<p>YAML удобен, но чувствителен к оформлению. Основные проблемы:</p>
132
<p>YAML удобен, но чувствителен к оформлению. Основные проблемы:</p>
133
<ul><li><p>неверные отступы или смешение табов и пробелов;</p>
133
<ul><li><p>неверные отступы или смешение табов и пробелов;</p>
134
</li>
134
</li>
135
<li><p>незаметные изменения типа значения (строка стала boolean или timestamp);</p>
135
<li><p>незаметные изменения типа значения (строка стала boolean или timestamp);</p>
136
</li>
136
</li>
137
<li><p>конфликт ключей при merge;</p>
137
<li><p>конфликт ключей при merge;</p>
138
</li>
138
</li>
139
<li><p>использование специальных символов без кавычек;</p>
139
<li><p>использование специальных символов без кавычек;</p>
140
</li>
140
</li>
141
<li><p>неодинаковые правила в разных парсерах и версиях спецификации.</p>
141
<li><p>неодинаковые правила в разных парсерах и версиях спецификации.</p>
142
</li>
142
</li>
143
</ul><h2>Практические требования к качеству YAML</h2>
143
</ul><h2>Практические требования к качеству YAML</h2>
144
<p>Чтобы конфигурации были стабильными, применяют простые правила:</p>
144
<p>Чтобы конфигурации были стабильными, применяют простые правила:</p>
145
<ul><li><p>единые отступы (часто 2 пробела) и автоматическое форматирование;</p>
145
<ul><li><p>единые отступы (часто 2 пробела) и автоматическое форматирование;</p>
146
</li>
146
</li>
147
<li><p>кавычки для спорных значений (yes, no, on, off, 0123, даты);</p>
147
<li><p>кавычки для спорных значений (yes, no, on, off, 0123, даты);</p>
148
</li>
148
</li>
149
<li><p>явные типы там, где важна строгая интерпретация;</p>
149
<li><p>явные типы там, где важна строгая интерпретация;</p>
150
</li>
150
</li>
151
<li><p>проверка схемой или тестами в CI, если формат критичен;</p>
151
<li><p>проверка схемой или тестами в CI, если формат критичен;</p>
152
</li>
152
</li>
153
<li><p>безопасная загрузка YAML в приложениях, без исполнения произвольных тегов.</p>
153
<li><p>безопасная загрузка YAML в приложениях, без исполнения произвольных тегов.</p>
154
</li>
154
</li>
155
</ul><h2>Валидация и контроль изменений</h2>
155
</ul><h2>Валидация и контроль изменений</h2>
156
<p>YAML сам по себе не навязывает схему. Контроль структуры реализуют средствами проекта:</p>
156
<p>YAML сам по себе не навязывает схему. Контроль структуры реализуют средствами проекта:</p>
157
<ul><li><p>проверка через JSON Schema после преобразования в JSON-представление;</p>
157
<ul><li><p>проверка через JSON Schema после преобразования в JSON-представление;</p>
158
</li>
158
</li>
159
<li><p>линтеры и форматтеры, которые ловят отступы, дубли ключей и стиль;</p>
159
<li><p>линтеры и форматтеры, которые ловят отступы, дубли ключей и стиль;</p>
160
</li>
160
</li>
161
<li><p>юнит-тесты конфигураций, которые проверяют обязательные поля и диапазоны значений.</p>
161
<li><p>юнит-тесты конфигураций, которые проверяют обязательные поля и диапазоны значений.</p>
162
</li>
162
</li>
163
</ul><p>YAML остается одним из базовых форматов для декларативного описания систем. Его сильная сторона - сочетание строгой структуры и удобства чтения человеком.</p>
163
</ul><p>YAML остается одним из базовых форматов для декларативного описания систем. Его сильная сторона - сочетание строгой структуры и удобства чтения человеком.</p>