Модуль 7.4: Автоматизація DevOps
Shell Scripting | Складність:
[MEDIUM]| Час: 30–35 хв
Передумови
Розділ «Передумови»Перед початком цього модуля:
- Обов’язково: Модуль 7.3: Практичні скрипти
- Обов’язково: Базові знання
kubectl. - Бажано: Досвід роботи з CI/CD.
Що ви зможете робити після цього модуля
Розділ «Що ви зможете робити після цього модуля»Після завершення цього модуля ви зможете:
- Побудувати скрипти автоматизації для деплойменту, моніторингу та реагування на інциденти
- Інтегрувати скрипти з API (curl + jq), Kubernetes (kubectl) та CI/CD конвеєрами
- Спроєктувати бібліотеку скриптів, що дотримується принципу DRY та зручна для підтримки командою
- Оцінити, коли використовувати bash, а коли Python/Go для задач автоматизації
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Робота в DevOps сповнена повторюваних завдань. Деплойменти, перевірки здоров’я систем, аналіз логів, керування кластерами — усе це потребує автоматизації. Bash-скрипти часто є найкращим інструментом: вони портативні, не потребують встановлення і чудово поєднуються з існуючими CLI-утилітами.
Розуміння автоматизації DevOps допоможе вам:
- Прискорити операції — одна команда замість десяти.
- Зменшити кількість помилок — скрипти не роблять друкарських помилок.
- Забезпечити самообслуговування — ваші скрипти зможуть використовувати колеги.
- Документувати процеси — скрипт — це документація, яку можна запустити.
Найкраща автоматизація — та, про яку ви забуваєте, бо вона просто працює.
Скрипти з kubectl
Розділ «Скрипти з kubectl»Команда kubectl спеціально розроблена для автоматизації.
Корисні формати виводу
Розділ «Корисні формати виводу»# JSON для повної обробки через jqkubectl get pods -o json
# JSONPath для вибору конкретних полівkubectl get pods -o jsonpath='{.items[*].metadata.name}'
# Спеціальні колонки (Custom columns)kubectl get pods -o custom-columns='NAME:.metadata.name,STATUS:.status.phase'
# Тільки назви (name)kubectl get pods -o name# Вивід: pod/nginx-abc123Корисні патерни
Розділ «Корисні патерни»# Отримати список усіх образів, що використовуються в кластеріkubectl get pods -A -o jsonpath='{.items[*].spec.containers[*].image}' | tr ' ' '\n' | sort -u
# Отримати поди, що НЕ в стані Runningkubectl get pods --field-selector='status.phase!=Running'
# Дочекатися готовності подаkubectl wait --for=condition=Ready pod -l app=nginx --timeout=60sСкрипти перевірки здоров’я (Health Check)
Розділ «Скрипти перевірки здоров’я (Health Check)»Приклад скрипта для перевірки стану вузлів (nodes):
#!/bin/bashset -euo pipefail
echo "=== Статус вузлів кластера ==="kubectl get nodes
# Знайти вузли в стані NotReadyNOT_READY=$(kubectl get nodes --no-headers | awk '$2 != "Ready" {print $1}')
if [[ -n "$NOT_READY" ]]; then echo "УВАГА: Наступні вузли не готові: $NOT_READY" exit 1fi
echo "Усі вузли здорові!"Скрипти деплойменту
Розділ «Скрипти деплойменту»Приклад безпечного оновлення образу з автоматичним відкатом:
#!/bin/bashset -euo pipefail
IMAGE=$1DEPLOYMENT="myapp"
echo "Оновлюємо $DEPLOYMENT на образ $IMAGE..."
# Запуск оновленняkubectl set image deployment/$DEPLOYMENT app=$IMAGE
# Очікування результатуif ! kubectl rollout status deployment/$DEPLOYMENT --timeout=5m; then echo "ПОМИЛКА: Оновлення не вдалося. Робимо відкат..." kubectl rollout undo deployment/$DEPLOYMENT exit 1fi
echo "Деплой завершено успішно!"Тест
Розділ «Тест»-
Як отримати тільки IP-адресу конкретного пода в змінну Bash?
Відповідь
`IP=$(kubectl get pod <назва> -o jsonpath='{.status.podIP}')`. -
Навіщо використовувати
kubectl waitу скриптах?Відповідь
Щоб призупинити виконання скрипта, поки ресурс не досягне потрібного стану (наприклад, поки под не стане Ready). Це надійніше, ніж використовувати `sleep`. -
Як передати список усіх подів, що мають мітку
app=nginx, командіkubectl deleteчерез канал (pipe)?Відповідь
`kubectl get pods -l app=nginx -o name | xargs kubectl delete`. -
Який прапор
kubectlдозволяє побачити, що зробить команда, не виконуючи її насправді?Відповідь
`--dry-run=client`. У поєднанні з `-o yaml` це дозволяє генерувати маніфести в скриптах.
Практична вправа
Розділ «Практична вправа»Завдання: Написати скрипт для збору логів усіх подів з помилками.
- Створіть файл
error-logs.sh:
#!/bin/bashset -euo pipefail
# Знайти всі поди з помилкамиERR_PODS=$(kubectl get pods --no-headers | awk '$3 != "Running" && $3 != "Completed" {print $1}')
if [[ -z "$ERR_PODS" ]]; then echo "Помилок не знайдено." exit 0fi
for POD in $ERR_PODS; do echo "=== Логи для $POD ===" kubectl logs "$POD" --tail=20 || echo "Не вдалося отримати логи" echo ""done- Зробіть його виконуваним та протестуйте.
Критерії успіху: Скрипт автоматично знаходить проблемні поди та виводить останні рядки їхніх логів.
Підсумок
Розділ «Підсумок»- kubectl ідеально підходить для скриптів.
- Використовуйте jsonpath для витягування даних.
- Завжди ставте timeouts на операції очікування.
- Додавайте dry-run режим для безпечного тестування автоматизації.
Вітаємо! Ви завершили великий розділ «Операції та Скрипти». Тепер ви не просто користувач Linux, а інженер, здатний автоматизувати складні хмарні системи.
Далі: Розділ 8: Просунуте адміністрування — або переходьте до вивчення Сертифікацій Kubernetes.