HTML Diff
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>&gt; сворачивает переносы в пробелы.</p>
102 <li><p>&gt; сворачивает переносы в пробелы.</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 (&lt;&lt;) объединяет маппинги.</p>
112 <p>Якорь помечает фрагмент данных, alias-ссылка обращается к нему, а merge (&lt;&lt;) объединяет маппинги.</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>