Модуль 7.3: Практичні скрипти
Shell Scripting | Складність:
[MEDIUM]| Час: 30–35 хв
Передумови
Розділ «Передумови»Перед початком цього модуля:
- Обов’язково: Модуль 7.1: Основи Bash
- Обов’язково: Модуль 7.2: Обробка тексту
- Бажано: Досвід вирішення будь-яких операційних задач.
Що ви зможете робити після цього модуля
Розділ «Що ви зможете робити після цього модуля»Після завершення цього модуля ви зможете:
- Написати production-ready скрипти з логуванням, обробкою помилок та конфігурацією
- Автоматизувати типові задачі сисадміна (ротація логів, перевірки здоров’я, скрипти деплойменту)
- Спроєктувати скрипти, що є ідемпотентними (безпечними для повторного запуску)
- Тестувати скрипти систематично з граничними випадками та валідувати вивід
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Написати скрипт, який спрацює один раз — легко. Написати скрипт, який надійно працюватиме в продакшні — набагато складніше. Цей модуль охоплює патерни, що роблять ваші скрипти придатними для підтримки, зручними для налагодження та безпечними для системи.
Розуміння практичного скриптингу допоможе вам:
- Писати надійну автоматизацію — скрипти, що не “ламаються” посеред ночі.
- Швидше знаходити проблеми — завдяки правильному логуванню та повідомленням про помилки.
- Створювати код для команди — такий, який зможуть зрозуміти інші (і ви самі через рік).
- Обробляти винятки — що робити, коли мережа впала або файл зник?
Різниця між “милицею” (hack) та автоматизацією — це обробка помилок.
Золотий шаблон скрипта
Розділ «Золотий шаблон скрипта»Використовуйте цей скелет для кожного нового скрипта:
#!/bin/bash
# Надійний стартset -euo pipefail
# === Налаштування ===readonly SCRIPT_NAME=$(basename "$0")readonly LOG_FILE="/tmp/${SCRIPT_NAME}.log"
# === Логування ===log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"}
# === Очищення при виході ===cleanup() { log "Очищення тимчасових файлів..." rm -f "/tmp/temp_data_*"}trap cleanup EXIT
# === Головна логіка ===main() { log "Скрипт запущено" # Ваш код тут log "Завершено успішно"}
main "$@"Обробка помилок та перевірки
Розділ «Обробка помилок та перевірки»Перевірка наявності команд
Розділ «Перевірка наявності команд»Ніколи не припускайте, що kubectl або jq встановлені.
if ! command -v kubectl &> /dev/null; then echo "Помилка: kubectl не знайдено." >&2 exit 1fiБезпечні змінні
Розділ «Безпечні змінні»Використовуйте значення за замовчуванням, щоб скрипт не падав через порожні аргументи.
# Якщо перший аргумент порожній, використати "default"NAMESPACE=${1:-"default"}Тимчасові файли
Розділ «Тимчасові файли»Ніколи не вигадуйте імена файлів типу /tmp/test.txt. Використовуйте mktemp.
TEMP_FILE=$(mktemp /tmp/myapp.XXXXXX)# mktemp створить унікальний файл і поверне шлях до ньогоТест
Розділ «Тест»-
Навіщо потрібна команда
trapу скриптах?Відповідь
Вона дозволяє виконати певну дію (наприклад, функцію очищення) при завершенні скрипта, незалежно від того, чи завершився він успішно, з помилкою, чи був перерваний користувачем (Ctrl+C). -
Що робить конструкція
set -o pipefail?Відповідь
Вона змушує ланцюжок команд (pipe) повертати помилку, якщо ХОЧ БИ ОДНА команда в ньому завершилася невдало. Без цього ланцюжок поверне успіх, якщо остання команда була успішною, навіть якщо перші впали. -
Як зробити скрипт, який показує довідку (Usage) при запуску без аргументів?
Відповідь
Перевірити кількість аргументів через зміну `$#`: `if [ $# -eq 0 ]; then usage; fi`. -
Яка перевага використання
readonlyдля констант?Відповідь
Це запобігає випадковій зміні важливих значень (наприклад, шляхів до логів) далі в коді, що робить скрипт більш передбачуваним та надійним.
Практична вправа
Розділ «Практична вправа»Завдання: Написати надійний скрипт для бекапу папки.
- Створіть файл
backup.sh:
#!/bin/bashset -euo pipefail
SOURCE=${1:-""}DEST="/tmp/backups"
if [[ -z "$SOURCE" ]]; then echo "Використання: $0 <папка_для_бекапу>" exit 1fi
mkdir -p "$DEST"ARCHIVE_NAME="backup_$(date +%Y%m%d_%H%M%S).tar.gz"
echo "Починаємо бекап $SOURCE..."tar -czf "$DEST/$ARCHIVE_NAME" "$SOURCE"echo "Бекап збережено: $DEST/$ARCHIVE_NAME"- Протестуйте його на будь-якій папці.
Критерії успіху: Скрипт створює архів, назва якого містить дату, і коректно реагує на відсутність аргументів.
Підсумок
Розділ «Підсумок»- Шаблони економлять час і запобігають багам.
- Trap — запорука чистоти в системі.
- Перевірка вводу — перша лінія захисту.
- Логування — ваш єдиний спосіб дізнатися, що пішло не так у фоновому режимі.
Далі: Модуль 7.4: Автоматизація DevOps — застосуйте навички скриптингу для реальних задач Kubernetes та хмарних платформ.