Skip to content

Commit cc6d9d4

Browse files
committed
[uk] Chart templates - yaml_techniques.md
Signed-off-by: Andrii Holovin <[email protected]>
1 parent f0cd26d commit cc6d9d4

File tree

1 file changed

+294
-0
lines changed

1 file changed

+294
-0
lines changed
Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
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

Comments
 (0)