Модуль 0.3: Vim для YAML
Складність:
[QUICK]— Вивчіть 10 команд, використовуйте їх завждиЧас на виконання: 20-30 хвилин
Передумови: Немає (Vim попередньо встановлений на екзаменаційних системах)
Що ви зможете робити
Розділ «Що ви зможете робити»Після цього модуля ви зможете:
- Редагувати YAML-файли у vim з правильними відступами (2 пробіли, без табуляцій)
- Виправити типові помилки YAML (неправильні відступи, відсутні поля) менше ніж за 30 секунд
- Налаштувати параметри vim (.vimrc), що роблять редагування YAML зручним на іспиті
- Використовувати 10 основних команд vim, які покривають 95% завдань редагування на CKA
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Іспит CKA вимагає редагування YAML-файлів. Багато. Ви будете створювати маніфести, виправляти зламані конфіги та модифікувати наявні ресурси — все в терміналі.
Екзаменаційне середовище за замовчуванням використовує nano (станом на 2025), але ви можете перемкнутися на vim. Незалежно від того, чи використовуєте ви vim чи nano, вам потрібно бути швидким. Цей модуль охоплює vim, оскільки він потужніший, коли ви знаєте основи.
Якщо вам більше подобається nano — це нормально, він простіший. Але навички vim стануть у пригоді при роботі з продакшном, де nano може бути недоступний.
Частина 1: Набір виживання у Vim
Розділ «Частина 1: Набір виживання у Vim»Вам не потрібно бути експертом у vim. Вам потрібні 10 команд.
1.1 Режими
Розділ «1.1 Режими»Vim має режими. Це спочатку бентежить усіх.
Аналогія з коробкою передач
Режими vim — це як коробка передач автомобіля. У Звичайному режимі (рух) ви навігуєте — рухаєтесь, не друкуєте. У Режимі вставки (парковка) ви стоїте на місці та друкуєте. У Командному режимі (задній хід) ви виконуєте спеціальні операції, як-от збереження. Ви ж не паркуєтесь під час руху. Vim змушує вас свідомо “перемикати передачі”. Спочатку це виглядає дивно, але саме це робить vim таким швидким, коли ви це засвоїте.
| Режим | Як увійти | Що робить |
|---|---|---|
| Звичайний | Esc | Навігація, видалення, копіювання, вставка |
| Вставка | i, a, o | Введення тексту |
| Командний | : | Збереження, вихід, пошук |
Правило: Коли заплуталися, натисніть Esc, щоб повернутися до Звичайного режиму.
1.2 Основні команди
Розділ «1.2 Основні команди»ВХІД У РЕЖИМ ВСТАВКИi Вставити перед курсоромa Вставити після курсораo Відкрити новий рядок нижче та вставитиO Відкрити новий рядок вище та вставити
НАВІГАЦІЯ (Звичайний режим)h Ліворучj Внизk Вгоруl Праворучgg Перейти до першого рядкаG Перейти до останнього рядка0 Перейти на початок рядка$ Перейти в кінець рядкаw Стрибнути вперед на одне словоb Стрибнути назад на одне слово
РЕДАГУВАННЯ (Звичайний режим)x Видалити символ під курсоромdd Видалити весь рядокyy Копіювати (yank) весь рядокp Вставити нижчеP Вставити вищеu СкасуватиCtrl+r Повторити
ПОШУК/pattern Шукати впередn Наступний збігN Попередній збіг
ЗБЕРЕЖЕННЯ ТА ВИХІД:w Зберегти (write):q Вийти:wq Зберегти та вийти:q! Вийти без збереження (відкинути зміни)1.3 Мінімум, який вам потрібен
Розділ «1.3 Мінімум, який вам потрібен»Чесно? Для іспиту ви можете обійтися цим:
i → Почати друкуватиEsc → Припинити друкувати:wq → Зберегти та вийтиdd → Видалити рядокu → Скасувати помилкуЦе 5 речей. Освойте їх, і ви не провалите іспит через vim.
Частина 2: Налаштування Vim для YAML
Розділ «Частина 2: Налаштування Vim для YAML»2.1 Створення ~/.vimrc
Розділ «2.1 Створення ~/.vimrc»YAML чутливий до пробілів. Неправильно налаштований vim зіпсує ваші відступи.
cat << 'EOF' > ~/.vimrc" Basic settingsset number " Show line numbersset tabstop=2 " Tab = 2 spacesset shiftwidth=2 " Indent = 2 spacesset expandtab " Use spaces, not tabsset autoindent " Maintain indentationset smartindent " Smart indentation for codeset paste " Prevent auto-indent on paste (toggle with :set nopaste)
" YAML specificautocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab
" Visual helpersset cursorline " Highlight current linesyntax on " Syntax highlightingset hlsearch " Highlight search resultsEOF2.2 Чому ці налаштування важливі
Розділ «2.2 Чому ці налаштування важливі»| Налаштування | Навіщо |
|---|---|
tabstop=2 | Kubernetes YAML використовує відступ у 2 пробіли |
expandtab | Перетворює табуляції на пробіли (табуляції ламають YAML) |
autoindent | Нові рядки зберігають відступ |
number | Номери рядків допомагають з повідомленнями про помилки |
set paste | Запобігає проблемам з автовідступом під час вставки |
Підводний камінь: Табуляції vs Пробіли
YAML вимагає послідовних відступів. Один символ табуляції, змішаний з пробілами, зламає ваш маніфест. Завжди використовуйте пробіли. Налаштування
expandtabавтоматично перетворює табуляції на пробіли.
Історія з практики: Невидимий символ
Досвідчений інженер витратив 45 хвилин на з’ясування, чому
kubectl applyпостійно падав з незрозумілою помилкою парсингу YAML. Маніфест виглядав ідеально. Зрештою він запустивcat -Aна файлі й виявив невидимі символи табуляції, змішані з пробілами — вони з’явилися при копіюванні коду зі сторінки Confluence. Урок: ніколи не довіряйте копіюванню-вставці. Завжди перевіряйте відступи та налаштуйте свій редактор показувати невидимі символи або автоматично перетворювати табуляції.
Частина 3: Робочі процеси редагування YAML
Розділ «Частина 3: Робочі процеси редагування YAML»3.1 Створення нового файлу
Розділ «3.1 Створення нового файлу»vim pod.yamlНатисніть i, щоб увійти в Режим вставки, потім введіть:
apiVersion: v1kind: Podmetadata: name: nginxspec: containers: - name: nginx image: nginxНатисніть Esc, потім :wq, щоб зберегти та вийти.
3.2 Копіювання рядків (швидше, ніж передрукування)
Розділ «3.2 Копіювання рядків (швидше, ніж передрукування)»Вам потрібно додати ще один контейнер. Замість того, щоб друкувати з нуля:
- Перейдіть до блоку контейнера
- Поставте курсор на
- name: nginx - Натисніть
V(візуальний рядковий режим) - Натисніть
jдвічі, щоб виділити 3 рядки - Натисніть
y, щоб скопіювати (yank) - Перейдіть туди, де хочете розмістити новий контейнер
- Натисніть
p, щоб вставити
3.3 Зміна відступів блоків
Розділ «3.3 Зміна відступів блоків»Виділили неправильний відступ? Виправте:
V, щоб увійти у візуальний рядковий режим- Виділіть рядки за допомогою
j/k >, щоб зсунути праворуч<, щоб зсунути ліворуч
Або у Звичайному режимі:
>>зсунути поточний рядок праворуч<<зсунути поточний рядок ліворуч
3.4 Видалення кількох рядків
Розділ «3.4 Видалення кількох рядків»Потрібно видалити цілу секцію?
- Перейдіть до початку секції
- Введіть
5dd, щоб видалити 5 рядків - Або
d}, щоб видалити до наступного порожнього рядка
3.5 Пошук і заміна
Розділ «3.5 Пошук і заміна»Неправильна назва образу по всьому файлу?
:%s/nginx:1.19/nginx:1.25/g%s= замінити у всьому файлі/старе/нове/= шаблонg= усі входження (не лише перше)
Частина 4: Вставка без спотворення
Розділ «Частина 4: Вставка без спотворення»Коли ви копіюєте YAML з документації та вставляєте у vim, автовідступ може спотворити його.
Метод 1: Встановити режим вставки
Розділ «Метод 1: Встановити режим вставки»Перед вставкою:
:set pasteВставте вміст (зазвичай Cmd+V або правий клік).
Після вставки:
:set nopasteМетод 2: Використати термінальну вставку
Розділ «Метод 2: Використати термінальну вставку»В екзаменаційному середовищі ви можете вставляти безпосередньо в термінал. Рядок :set paste у вашому .vimrc допомагає, але будьте уважні.
Метод 3: Альтернатива — використати cat
Розділ «Метод 3: Альтернатива — використати cat»Якщо вставка через vim проблематична:
cat << 'EOF' > pod.yamlapiVersion: v1kind: Podmetadata: name: nginxspec: containers: - name: nginx image: nginxEOFЦе повністю уникає vim для створення файлів.
Частина 5: Картка швидкої довідки
Розділ «Частина 5: Картка швидкої довідки»Роздрукуйте це або запам’ятайте:
╔════════════════════════════════════════════════════╗║ КОРОТКА ДОВІДКА VIM ДЛЯ YAML ║╠════════════════════════════════════════════════════╣║ РЕЖИМИ ║║ Esc → Звичайний режим (навігація) ║║ i → Режим вставки (друкування) ║║ : → Командний режим (збереження/вихід) ║╠════════════════════════════════════════════════════╣║ ПЕРЕМІЩЕННЯ ║║ gg → Початок файлу ║║ G → Кінець файлу ║║ 0 → Початок рядка ║║ $ → Кінець рядка ║║ /pattern → Пошук ║╠════════════════════════════════════════════════════╣║ РЕДАГУВАННЯ ║║ dd → Видалити рядок ║║ yy → Копіювати рядок ║║ p → Вставити нижче ║║ u → Скасувати ║║ >> → Відступ праворуч ║║ << → Відступ ліворуч ║╠════════════════════════════════════════════════════╣║ ЗБЕРЕЖЕННЯ/ВИХІД ║║ :w → Зберегти ║║ :q → Вийти ║║ :wq → Зберегти та вийти ║║ :q! → Вийти без збереження ║╠════════════════════════════════════════════════════╣║ СПЕЦИФІКА YAML ║║ :set paste → Перед вставкою ║║ :set nopaste → Після вставки ║╚════════════════════════════════════════════════════╝Частина 6: Альтернатива — Nano
Розділ «Частина 6: Альтернатива — Nano»Якщо vim здається занадто складним, використовуйте nano. Це тепер редактор за замовчуванням на іспиті.
nano pod.yamlNano показує комбінації клавіш внизу:
Ctrl+O= Зберегти (Write Out)Ctrl+X= ВийтиCtrl+K= Вирізати рядокCtrl+U= Вставити
Для YAML створіть ~/.nanorc:
cat << 'EOF' > ~/.nanorcset tabsize 2set tabstospacesset autoindentset linenumbersEOFПорада для іспиту
Екзаменаційне середовище (станом на 2025) за замовчуванням використовує nano, але ви можете використовувати vim, якщо бажаєте. Виберіть один і дотримуйтесь його — не витрачайте час на іспиті на дебати щодо редакторів.
Чи знали ви?
Розділ «Чи знали ви?»-
Vim є на кожному сервері Linux. Вивчення vim окупиться далеко за межами іспиту — ви будете використовувати його для усунення проблем у продакшні, дебагу контейнерів та скрізь, де GUI недоступний.
-
Творець vim (Bram Moolenaar) помер у 2023 році. Проєкт продовжує існувати як open-source спільнота. Neovim — популярний сучасний форк.
-
vimtutorвже вбудований. Запустітьvimtutorу будь-якому терміналі для інтерактивного посібника з vim. Займає близько 30 хвилин і навчить вас більшому, ніж цей модуль.
Типові помилки
Розділ «Типові помилки»| Помилка | Проблема | Рішення |
|---|---|---|
| Застрягли в режимі вставки | Не вдається навігувати | Натисніть Esc |
| Вставлений YAML спотворений | Автовідступ | :set paste перед вставкою |
| Символи табуляції в YAML | Синтаксична помилка YAML | Використовуйте expandtab у .vimrc |
| Втрачені зміни | Вийшли без збереження | Використовуйте :wq, а не :q! |
| Неправильні відступи | Парсинг YAML невдалий | >> та << для виправлення |
Тест
Розділ «Тест»-
Як видалити 3 рядки у vim?
Відповідь
Поставте курсор на перший рядок, введіть `3dd` у Звичайному режимі. -
Ви вставили YAML, і відступи зламалися. Що сталося і як цьому запобігти?
Відповідь
Автовідступ vim спотворив вставку. Використовуйте `:set paste` перед вставкою, потім `:set nopaste` після. -
Яка команда для збереження та виходу з vim?
Відповідь
`:wq` (write and quit). Або `ZZ` у Звичайному режимі (менш поширений варіант). -
Чому у YAML потрібно використовувати пробіли замість табуляцій?
Відповідь
YAML вимагає послідовних відступів. Змішування табуляцій і пробілів (або використання табуляцій, коли парсер очікує пробіли) спричиняє синтаксичні помилки. Маніфести Kubernetes очікують відступ у 2 пробіли.
Практична вправа
Розділ «Практична вправа»Завдання: Налаштуйте vim і попрактикуйтесь у редагуванні YAML.
Підготовка:
# Create .vimrc with YAML settingscat << 'EOF' > ~/.vimrcset numberset tabstop=2set shiftwidth=2set expandtabset autoindentsyntax onEOFПрактичні завдання:
-
Створіть маніфест Пода з нуля:
Terminal window vim practice-pod.yaml# Type a complete Pod manifest# Save and exit -
Продублюйте блок контейнера:
- Відкрийте файл
- Скопіюйте секцію контейнера
- Вставте та змініть назву
-
Виправте навмисно зламані відступи:
Terminal window cat << 'EOF' > broken.yamlapiVersion: v1kind: Podmetadata:name: testspec:containers:- name: nginximage: nginxEOF# Open in vim and fix indentation
Критерії успіху:
- Можете створити валідний маніфест Пода у vim
- Можете копіювати та вставляти блоки всередині vim
- Можете виправляти проблеми з відступами
- Знаєте, як зберегти та вийти
Перевірка:
# Validate your YAMLkubectl apply -f practice-pod.yaml --dry-run=clientПрактичні вправи
Розділ «Практичні вправи»Вправа 1: Тест швидкості Vim (Ціль: 2 хвилини)
Розділ «Вправа 1: Тест швидкості Vim (Ціль: 2 хвилини)»Створіть цей маніфест Пода з нуля у vim:
vim speed-test.yamlВведіть це (не копіюйте-вставляйте):
apiVersion: v1kind: Podmetadata: name: nginx labels: app: webspec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80Збережіть і перевірте:
kubectl apply -f speed-test.yaml --dry-run=clientrm speed-test.yamlВправа 2: Виправлення зламаного YAML — Відступи (Ціль: 3 хвилини)
Розділ «Вправа 2: Виправлення зламаного YAML — Відступи (Ціль: 3 хвилини)»# Create broken YAMLcat << 'EOF' > broken-indent.yamlapiVersion: v1kind: Podmetadata:name: broken-pod labels: app: testspec: containers: - name: nginx image: nginx ports: - containerPort: 80EOF
# Open in vim and fix ALL indentation errorsvim broken-indent.yaml
# Validate your fixkubectl apply -f broken-indent.yaml --dry-run=clientrm broken-indent.yamlВиправлена версія
apiVersion: v1kind: Podmetadata: name: broken-pod labels: app: testspec: containers: - name: nginx image: nginx ports: - containerPort: 80Вправа 3: Виправлення зламаного YAML — Змішані табуляції/пробіли (Ціль: 3 хвилини)
Розділ «Вправа 3: Виправлення зламаного YAML — Змішані табуляції/пробіли (Ціль: 3 хвилини)»# Create YAML with hidden tab charactersprintf 'apiVersion: v1\nkind: Pod\nmetadata:\n\tname: tab-pod\nspec:\n\tcontainers:\n\t- name: nginx\n\t image: nginx\n' > broken-tabs.yaml
# Look at it - seems fine visuallycat broken-tabs.yaml
# But kubectl fails!kubectl apply -f broken-tabs.yaml --dry-run=client
# YOUR TASK: Open in vim and fixvim broken-tabs.yaml# Hint: In vim, use :%s/\t/ /g to replace tabs with spaces
kubectl apply -f broken-tabs.yaml --dry-run=clientrm broken-tabs.yamlВправа 4: Копіювання та модифікація блоків (Ціль: 2 хвилини)
Розділ «Вправа 4: Копіювання та модифікація блоків (Ціль: 2 хвилини)»# Create a deployment with one containercat << 'EOF' > multi-container.yamlapiVersion: v1kind: Podmetadata: name: multispec: containers: - name: app image: nginx ports: - containerPort: 80EOF
# YOUR TASK in vim:# 1. Duplicate the container block# 2. Change second container to: name: sidecar, image: busybox, remove ports# Target: 2 minutes
vim multi-container.yaml
# Validatekubectl apply -f multi-container.yaml --dry-run=clientrm multi-container.yamlОчікуваний результат
apiVersion: v1kind: Podmetadata: name: multispec: containers: - name: app image: nginx ports: - containerPort: 80 - name: sidecar image: busyboxВправа 5: Пошук і заміна (Ціль: 1 хвилина)
Розділ «Вправа 5: Пошук і заміна (Ціль: 1 хвилина)»# Create file with wrong image versioncat << 'EOF' > version-fix.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: webspec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: nginx:1.19 - name: log image: fluentd:1.19 - name: cache image: redis:1.19EOF
# YOUR TASK: Change ALL "1.19" to "1.25" using vim search/replace# Command: :%s/1.19/1.25/g
vim version-fix.yaml
# Verify all changedgrep "1.25" version-fix.yaml # Should show 3 linesrm version-fix.yamlВправа 6: Виправлення зламаного YAML — Синтаксичні помилки (Ціль: 5 хвилин)
Розділ «Вправа 6: Виправлення зламаного YAML — Синтаксичні помилки (Ціль: 5 хвилин)»Цей YAML має кілька помилок. Знайдіть і виправте їх усі:
cat << 'EOF' > broken-syntax.yamlapiVersion: v1kind: Podmetadata: name: syntax-errors labels: app: test environment: production # missing quotes on value with special charsspec: containers: - name: app image: nginx env: - name: DATABASE_URL value: postgres://user:p@ssword@db:5432 # @ needs quoting - name: DEBUG value: true # boolean should be string ports: - containerPort: "80" # should be integer, not string resources: requests: memory: 128Mi # missing quotes won't break, but... cpu: 100 # should be 100mEOF
vim broken-syntax.yaml
# Testkubectl apply -f broken-syntax.yaml --dry-run=clientrm broken-syntax.yamlВиправлена версія
apiVersion: v1kind: Podmetadata: name: syntax-errors labels: app: test environment: productionspec: containers: - name: app image: nginx env: - name: DATABASE_URL value: "postgres://user:p@ssword@db:5432" - name: DEBUG value: "true" ports: - containerPort: 80 resources: requests: memory: "128Mi" cpu: "100m"Вправа 7: Випробування — Тест швидкості Nano
Розділ «Вправа 7: Випробування — Тест швидкості Nano»Якщо ви надаєте перевагу nano, виконайте Вправу 1 за допомогою nano:
nano speed-test.yaml# Ctrl+O to save, Ctrl+X to exitkubectl apply -f speed-test.yaml --dry-run=clientrm speed-test.yamlПорівняйте свій час з vim. Використовуйте те, що швидше для вас.
Наступний модуль
Розділ «Наступний модуль»Модуль 0.4: Навігація по kubernetes.io — Як швидко знаходити документацію під час іспиту.