|
| 1 | +--- |
| 2 | +title: "Додаток: Техніки YAML" |
| 3 | +description: Ближчий погляд на специфікацію YAML та її застосування в Helm. |
| 4 | +sidebar_position: 15 |
| 5 | +--- |
| 6 | + |
| 7 | +Більшість цього посібника зосереджена на мові шаблонів. Тут ми розглянемо формат YAML. YAML має кілька корисних функцій, які ми, як автори шаблонів, можемо використовувати для того, щоб зробити наші шаблони менш схильними до помилок і легшими для читання. |
| 8 | + |
| 9 | +## Масиви та Колекції {#scalars-and-collections} |
| 10 | + |
| 11 | +Згідно зі [специфікацією YAML](https://yaml.org/spec/1.2/spec.html), існують два типи колекцій та багато типів скалярів. |
| 12 | + |
| 13 | +Два типи колекцій — це map та послідовності: |
| 14 | + |
| 15 | +```yaml |
| 16 | +map: |
| 17 | + one: 1 |
| 18 | + two: 2 |
| 19 | + three: 3 |
| 20 | + |
| 21 | +sequence: |
| 22 | + - one |
| 23 | + - two |
| 24 | + - three |
| 25 | +``` |
| 26 | +
|
| 27 | +Скалярні значення – це окремі значення (на відміну від колекцій). |
| 28 | +
|
| 29 | +### Типи скалярів у YAML {#scalar-types-in-yaml} |
| 30 | +
|
| 31 | +У діалекті YAML від Helm тип скалярних даних значення визначається складною сукупністю правил, включаючи схему Kubernetes для визначень ресурсів. Але при виведенні типів, як правило, діють наступні правила. |
| 32 | +
|
| 33 | +Якщо ціле число або число з рухомою комою є словом без лапок, воно зазвичай розглядається як числовий тип: |
| 34 | +
|
| 35 | +```yaml |
| 36 | +count: 1 |
| 37 | +size: 2.34 |
| 38 | +``` |
| 39 | +
|
| 40 | +Але якщо вони укладені в лапки, вони трактуються як рядки: |
| 41 | +
|
| 42 | +```yaml |
| 43 | +count: "1" # <-- рядок, не int |
| 44 | +size: '2.34' # <-- рядок, не float |
| 45 | +``` |
| 46 | +
|
| 47 | +Те ж саме стосується булевих значень: |
| 48 | +
|
| 49 | +```yaml |
| 50 | +isGood: true # bool |
| 51 | +answer: "true" # рядок |
| 52 | +``` |
| 53 | +
|
| 54 | +Слово для порожнього значення — `null` (не `nil`). |
| 55 | + |
| 56 | +Зверніть увагу, що `port: "80"` є дійсним YAML і пройде через рушій шаблонів та парсер YAML, але зазнає невдачі, якщо Kubernetes очікує, що `port` буде цілим числом. |
| 57 | + |
| 58 | +У деяких випадках ви можете примусово визначити певний тип, використовуючи теґи вузлів YAML: |
| 59 | + |
| 60 | +```yaml |
| 61 | +coffee: "yes, please" |
| 62 | +age: !!str 21 |
| 63 | +port: !!int "80" |
| 64 | +``` |
| 65 | + |
| 66 | +У наведеному вище прикладі `!!str` говорить парсеру, що `age` є рядком, навіть якщо він виглядає як int. А `port` трактуватиметься як int, навіть якщо він укладений в лапки. |
| 67 | + |
| 68 | +## Рядки в YAML {#strings-in-yaml} |
| 69 | + |
| 70 | +Більшість даних, які ми розміщуємо в документах YAML, є рядками. YAML має кілька способів представлення рядків. Цей розділ пояснює способи та демонструє, як використовувати деякі з них. |
| 71 | + |
| 72 | +Існують три "вбудовані" способи оголошення рядка: |
| 73 | + |
| 74 | +```yaml |
| 75 | +way1: просто слова |
| 76 | +way2: "рядки в подвійних лапках" |
| 77 | +way3: 'рядки в одинарних лапках' |
| 78 | +``` |
| 79 | + |
| 80 | +Всі вбудовані стилі мають бути в одному рядку. |
| 81 | + |
| 82 | +- Невкладені слова не мають лапок і не екрановані. Тому потрібно бути обережним із символами, які ви використовуєте. |
| 83 | +- Рядки в подвійних лапках можуть мати спеціальні символи екрановані за допомогою `\`. Наприклад, `"\"Hello\", she said"`. Можна екранувати розриви рядка за допомогою `\n`. |
| 84 | +- Рядки в одинарних лапках є "літеральними" рядками та не використовують `\` для екранування символів. Єдине екранування — це `''`, яке декодується як один символ `'`. |
| 85 | + |
| 86 | +Окрім рядків в один рядок, можна оголосити багаторядкові рядки: |
| 87 | + |
| 88 | +```yaml |
| 89 | +coffee: | |
| 90 | + Latte |
| 91 | + Cappuccino |
| 92 | + Espresso |
| 93 | +``` |
| 94 | + |
| 95 | +Вищенаведене буде трактувати значення `coffee` як один рядок, еквівалентний `Latte\nCappuccino\nEspresso\n`. |
| 96 | + |
| 97 | +Зверніть увагу, що перший рядок після `|` повинен мати вірний відступ. Тому ми можемо зламати приклад вище, зробивши це: |
| 98 | + |
| 99 | +```yaml |
| 100 | +coffee: | |
| 101 | + Latte |
| 102 | + Cappuccino |
| 103 | + Espresso |
| 104 | +
|
| 105 | +``` |
| 106 | + |
| 107 | +Оскільки `Latte` має неправильний відступ, ми отримаємо помилку на кшталт: |
| 108 | + |
| 109 | +```none |
| 110 | +Error parsing file: error converting YAML to JSON: yaml: line 7: did not find expected key |
| 111 | +``` |
| 112 | + |
| 113 | +У шаблонах іноді безпечніше помістити несправжній "перший рядок" у багаторядковому документі лише для захисту від цієї помилки: |
| 114 | + |
| 115 | +```yaml |
| 116 | +coffee: | |
| 117 | + # Commented first line |
| 118 | + Latte |
| 119 | + Cappuccino |
| 120 | + Espresso |
| 121 | +
|
| 122 | +``` |
| 123 | + |
| 124 | +Зауважте, що яким би не був цей перший рядок, його буде збережено у виведенні рядка. Тому, якщо ви, наприклад, використовуєте цю техніку для вливання вмісту файлу в ConfigMap, коментар має бути типу, який очікується тим, хто читає цей запис. |
| 125 | + |
| 126 | +### Керування пробілами в багаторядкових рядках {#controlling-spaces-in-multiline-strings} |
| 127 | + |
| 128 | +У наведеному вище прикладі ми використовували `|`, щоб позначити багаторядковий рядок. Але зверніть увагу, що вміст нашого рядка завершувався з кінцевим `\n`. Якщо ми хочемо, щоб обробник YAML видалив кінцевий перенос рядка, ми можемо додати `-` після `|`: |
| 129 | + |
| 130 | +```yaml |
| 131 | +coffee: |- |
| 132 | + Latte |
| 133 | + Cappuccino |
| 134 | + Espresso |
| 135 | +``` |
| 136 | + |
| 137 | +Тепер значення `coffee` буде: `Latte\nCappuccino\nEspresso` (без кінцевого `\n`). |
| 138 | + |
| 139 | +В інших випадках ми можемо захотіти зберегти весь кінцевий пробіл. Ми можемо зробити це за допомогою позначення `|+`: |
| 140 | + |
| 141 | +```yaml |
| 142 | +coffee: |+ |
| 143 | + Latte |
| 144 | + Cappuccino |
| 145 | + Espresso |
| 146 | +
|
| 147 | +
|
| 148 | +another: value |
| 149 | +``` |
| 150 | + |
| 151 | +Тепер значення `coffee` буде `Latte\nCappuccino\nEspresso\n\n\n`. |
| 152 | + |
| 153 | +Відступи всередині текстового блоку зберігаються, що призводить до збереження переносу рядків: |
| 154 | + |
| 155 | +```yaml |
| 156 | +coffee: |- |
| 157 | + Latte |
| 158 | + 12 oz |
| 159 | + 16 oz |
| 160 | + Cappuccino |
| 161 | + Espresso |
| 162 | +``` |
| 163 | + |
| 164 | +У наведеному вище випадку значення `coffee` буде `Latte\n 12 oz\n 16 oz\nCappuccino\nEspresso`. |
| 165 | + |
| 166 | +### Відступи та шаблони {#indenting-and-templates} |
| 167 | + |
| 168 | +Коли ви пишете шаблони, ви можете захотіти вставити вміст файлу в шаблон. Як ми бачили в попередніх розділах, є два способи зробити це: |
| 169 | + |
| 170 | +- Використовуйте `{{ .Files.Get "FILENAME" }}`, щоб отримати вміст файлу в чартах. |
| 171 | +- Використовуйте `{{ include "TEMPLATE" . }}`, щоб відобразити шаблон, а потім вставити його вміст у чарти. |
| 172 | + |
| 173 | +Коли ви вставляєте файли в YAML, корисно розуміти правила багаторядкових рядків. Найчастіше найпростіший спосіб вставити статичний файл — зробити щось на кшталт цього: |
| 174 | + |
| 175 | +```go |
| 176 | +myfile: | |
| 177 | +{{ .Files.Get "myfile.txt" | indent 2 }} |
| 178 | +``` |
| 179 | + |
| 180 | +Зверніть увагу, як ми робимо відступ вище: `indent 2` вказує рушію шаблонів зробити відступ у два пробіли в кожному рядку файлу «myfile.txt». Зверніть увагу, що ми не робимо відступ у цьому рядку шаблону. Це тому, що якщо ми це зробимо, вміст першого рядка файлу буде відступлений двічі. |
| 181 | + |
| 182 | +### Згортання багаторядкових рядків {#folded-multi-line-strings} |
| 183 | + |
| 184 | +Іноді вам потрібно представити рядок у вашому YAML на кількох рядках, але ви хочете, щоб він трактувався як один довгий рядок під час інтерпретації. Це називається "згортанням". Щоб оголосити згортання блоку, використовуйте `>` замість `|`: |
| 185 | + |
| 186 | +```yaml |
| 187 | +coffee: > |
| 188 | + Latte |
| 189 | + Cappuccino |
| 190 | + Espresso |
| 191 | +
|
| 192 | +
|
| 193 | +``` |
| 194 | + |
| 195 | +Значення `coffee` буде `Latte Cappuccino Espresso\n`. Зверніть увагу, що всі, крім останнього переносу рядка, будуть перетворені на пробіли. Ви можете поєднувати контроль пробілів із позначкою згортання тексту, тому `>-` замінить або обрізає всі нові рядки. |
| 196 | + |
| 197 | +Зверніть увагу, що в згортанні синтаксису відступ тексту призведе до збереження рядків. |
| 198 | + |
| 199 | +```yaml |
| 200 | +coffee: >- |
| 201 | + Latte |
| 202 | + 12 oz |
| 203 | + 16 oz |
| 204 | + Cappuccino |
| 205 | + Espresso |
| 206 | +``` |
| 207 | + |
| 208 | +Наведене вище створить `Latte\n 12 oz\n 16 oz\nCappuccino Espresso`. Зверніть увагу, що і пробіли, і нові рядки все ще присутні. |
| 209 | + |
| 210 | +## Вбудовування кількох документів в один файл {#embedding-multiple-documents-in-one-file} |
| 211 | + |
| 212 | +Можливо розмістити більше одного YAML-документа в одному файлі. Це робиться шляхом префіксації нового документа `---` і закінчення документа `...` |
| 213 | + |
| 214 | +```yaml |
| 215 | +
|
| 216 | +--- |
| 217 | +document: 1 |
| 218 | +... |
| 219 | +--- |
| 220 | +document: 2 |
| 221 | +... |
| 222 | +``` |
| 223 | + |
| 224 | +У багатьох випадках можна опустити `---` або `...`. |
| 225 | + |
| 226 | +Деякі файли в Helm не можуть містити більше одного документа. Якщо, наприклад, у файлі `values.yaml` надано більше одного документа, буде використано лише перший. |
| 227 | + |
| 228 | +Однак файли шаблонів можуть мати більше одного документа. Коли це трапляється, файл (і всі його документи) обробляється як один обʼєкт під час рендерингу шаблонів. Але потім отриманий YAML розділяється на кілька документів, перш ніж він буде переданий Kubernetes. |
| 229 | + |
| 230 | +Ми рекомендуємо використовувати кілька документів у файлі лише в разі крайньої потреби. Наявність кількох документів у файлі може ускладнити налагодження. |
| 231 | + |
| 232 | +## YAML є надмножиною JSON {#yaml-is-a-superset-of-json} |
| 233 | + |
| 234 | +Оскільки YAML є надмножиною JSON, будь-який дійсний JSON-документ _повинен_ бути дійсним YAML. |
| 235 | + |
| 236 | +```json |
| 237 | +{ |
| 238 | + "coffee": "yes, please", |
| 239 | + "coffees": [ |
| 240 | + "Latte", "Cappuccino", "Espresso" |
| 241 | + ] |
| 242 | +} |
| 243 | +``` |
| 244 | + |
| 245 | +Вищенаведене є іншим способом представлення цього: |
| 246 | + |
| 247 | +```yaml |
| 248 | +coffee: yes, please |
| 249 | +coffees: |
| 250 | +- Latte |
| 251 | +- Cappuccino |
| 252 | +- Espresso |
| 253 | +``` |
| 254 | + |
| 255 | +І їх можна змішувати (з обережністю): |
| 256 | + |
| 257 | +```yaml |
| 258 | +coffee: "yes, please" |
| 259 | +coffees: [ "Latte", "Cappuccino", "Espresso"] |
| 260 | +``` |
| 261 | + |
| 262 | +Усі три повинні перетворюватись в однакове внутрішнє подання. |
| 263 | + |
| 264 | +Це означає, що файли, такі як `values.yaml`, можуть містити дані JSON, але Helm не трактує розширення файлу `.json` як дійсний суфікс. |
| 265 | + |
| 266 | +## Якорі YAML {#yaml-anchors} |
| 267 | + |
| 268 | +Специфікація YAML надає спосіб зберігати посилання на значення і пізніше посилатися на це значення за допомогою посилання. YAML називає це "якорінням":g": |
| 269 | + |
| 270 | +```yaml |
| 271 | +coffee: "yes, please" |
| 272 | +favorite: &favoriteCoffee "Cappuccino" |
| 273 | +coffees: |
| 274 | + - Latte |
| 275 | + - *favoriteCoffee |
| 276 | + - Espresso |
| 277 | +``` |
| 278 | + |
| 279 | +У наведеному вище прикладі `&favoriteCoffee` встановлює посилання на `Cappuccino`. Пізніше це посилання використовується як `*favoriteCoffee`. Таким чином, `coffees` стає `Latte, Cappuccino, Espresso`. |
| 280 | + |
| 281 | +Хоча є кілька випадків, коли якорі корисні, існує один аспект їх використання, який може спричинити тонкі помилки: під час першого використання YAML посилання розширюється і потім видаляється. |
| 282 | + |
| 283 | +Тому, якщо ми декодуємо і потім повторно кодуємо приклад вище, отриманий YAML буде таким: |
| 284 | + |
| 285 | +```yaml |
| 286 | +coffee: yes, please |
| 287 | +favorite: Cappuccino |
| 288 | +coffees: |
| 289 | +- Latte |
| 290 | +- Cappuccino |
| 291 | +- Espresso |
| 292 | +``` |
| 293 | + |
| 294 | +Оскільки Helm і Kubernetes часто читають, змінюють і потім переписують файли YAML, якорі будуть втрачені. |
0 commit comments