Перейти до вмісту

Модуль 7.3: Практичні скрипти

Hands-On Lab Available
Ubuntu intermediate 30 min
Launch Lab ↗

Opens in Killercoda in a new tab

Shell Scripting | Складність: [MEDIUM] | Час: 30–35 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після завершення цього модуля ви зможете:

  • Написати 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 встановлені.

Terminal window
if ! command -v kubectl &> /dev/null; then
echo "Помилка: kubectl не знайдено." >&2
exit 1
fi

Використовуйте значення за замовчуванням, щоб скрипт не падав через порожні аргументи.

Terminal window
# Якщо перший аргумент порожній, використати "default"
NAMESPACE=${1:-"default"}

Ніколи не вигадуйте імена файлів типу /tmp/test.txt. Використовуйте mktemp.

Terminal window
TEMP_FILE=$(mktemp /tmp/myapp.XXXXXX)
# mktemp створить унікальний файл і поверне шлях до нього

  1. Навіщо потрібна команда trap у скриптах?

    Відповідь Вона дозволяє виконати певну дію (наприклад, функцію очищення) при завершенні скрипта, незалежно від того, чи завершився він успішно, з помилкою, чи був перерваний користувачем (Ctrl+C).
  2. Що робить конструкція set -o pipefail?

    Відповідь Вона змушує ланцюжок команд (pipe) повертати помилку, якщо ХОЧ БИ ОДНА команда в ньому завершилася невдало. Без цього ланцюжок поверне успіх, якщо остання команда була успішною, навіть якщо перші впали.
  3. Як зробити скрипт, який показує довідку (Usage) при запуску без аргументів?

    Відповідь Перевірити кількість аргументів через зміну `$#`: `if [ $# -eq 0 ]; then usage; fi`.
  4. Яка перевага використання readonly для констант?

    Відповідь Це запобігає випадковій зміні важливих значень (наприклад, шляхів до логів) далі в коді, що робить скрипт більш передбачуваним та надійним.

Завдання: Написати надійний скрипт для бекапу папки.

  1. Створіть файл backup.sh:
#!/bin/bash
set -euo pipefail
SOURCE=${1:-""}
DEST="/tmp/backups"
if [[ -z "$SOURCE" ]]; then
echo "Використання: $0 <папка_для_бекапу>"
exit 1
fi
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"
  1. Протестуйте його на будь-якій папці.

Критерії успіху: Скрипт створює архів, назва якого містить дату, і коректно реагує на відсутність аргументів.


  • Шаблони економлять час і запобігають багам.
  • Trap — запорука чистоти в системі.
  • Перевірка вводу — перша лінія захисту.
  • Логування — ваш єдиний спосіб дізнатися, що пішло не так у фоновому режимі.

Далі: Модуль 7.4: Автоматизація DevOps — застосуйте навички скриптингу для реальних задач Kubernetes та хмарних платформ.