← Назад к вопросам
Какие скрипты писал на Bash
1.0 Junior🔥 221 комментариев
#Скриптинг и программирование
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Навыки и практики в Bash-скриптировании
За более чем 10 лет работы в DevOps я написал сотни Bash-скриптов различной сложности — от простых утилит до комплексных системных инструментов. Bash для меня не просто язык для автоматизации рутинных задач, а мощный инструмент интеграции, оркестрации и управления инфраструктурой.
Основные категории скриптов
1. Скрипты для управления инфраструктурой
- Проверка состояния систем: Мониторинг дискового пространства, загрузки CPU, памяти, сетевых интерфейсов
#!/bin/bash
# Мониторинг дискового пространства с отправкой алертов
THRESHOLD=90
CURRENT_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ]; then
echo "Критическое использование диска: ${CURRENT_USAGE}%" | \
mail -s "Disk Alert on $(hostname)" admin@company.com
fi
- Автоматизация развертывания: Скрипты для деплоя приложений с проверками и откатом
#!/bin/bash
# Деплой с blue-green стратегией
DEPLOY_VERSION="v2.1.4"
BACKUP_DIR="/opt/app_backup_$(date +%Y%m%d_%H%M%S)"
# Создание бекапа текущей версии
tar -czf "${BACKUP_DIR}.tar.gz" /opt/application
# Развертывание новой версии
if wget -O /tmp/app_${DEPLOY_VERSION}.tar.gz "https://repo.company.com/app/${DEPLOY_VERSION}.tar.gz"; then
tar -xzf /tmp/app_${DEPLOY_VERSION}.tar.gz -C /opt/
systemctl restart application
# Проверка здоровья
sleep 10
if curl -f http://localhost:8080/health; then
echo "Деплой успешен"
else
# Откат при неудаче
tar -xzf "${BACKUP_DIR}.tar.gz" -C /opt/
systemctl restart application
echo "Деплой откачен"
fi
fi
2. Скрипты для CI/CD пайплайнов
- Подготовка окружений: Установка зависимостей, настройка переменных
- Запуск тестов: Автоматизация тестирования с разными конфигурациями
#!/bin/bash
# Скрипт для Jenkins/GitLab CI
set -euo pipefail # Строгий режим
# Загрузка секретов из HashiCorp Vault
export DB_PASSWORD=$(vault kv get -field=password secret/app/db)
# Запуск тестов в контейнерах
docker-compose -f docker-compose.test.yml up -d
sleep 30
# Выполнение тестовой серии
pytest tests/ --junitxml=test-results.xml
TEST_EXIT_CODE=$?
# Сборка артефактов
tar -czf test-artifacts-${BUILD_NUMBER}.tar.gz logs/ test-results.xml/
exit $TEST_EXIT_CODE
3. Утилиты для работы с контейнерами
- Очистка Docker: Удаление неиспользуемых образов, контейнеров, томов
#!/bin/bash
# Комплексная очистка Docker-окружения
echo "Очистка остановленных контейнеров..."
docker container prune -f
echo "Удаление образов без тегов..."
docker images --filter "dangling=true" -q | xargs -r docker rmi
echo "Очистка томов..."
docker volume prune -f
# Агрессивная очистка (для CI серверов)
if [ "${1:-}" == "--aggressive" ]; then
echo "Удаление всех неиспользуемых образов..."
docker image prune -a -f
fi
4. Мониторинг и алертинг
- Кастомные метрики для Prometheus: Сбор специфичных метрик приложений
- Скрипты проверки доступности: Комплексные health-check с цепочками зависимостей
5. Работа с облачными API
- AWS/GCP/Azure CLI обертки: Автоматизация управления облачными ресурсами
#!/bin/bash
# Автоматическое масштабирование инстансов AWS
INSTANCE_COUNT=$(aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-name prod-group \
--query "AutoScalingGroups[0].Instances" \
--output text | wc -l)
LOAD_AVERAGE=$(uptime | awk -F'load average:' '{print $2}' | cut -d, -f1 | tr -d ' ')
if (( $(echo "$LOAD_AVERAGE > 2.5" | bc -l) )) && [ $INSTANCE_COUNT -lt 5 ]; then
aws autoscaling set-desired-capacity \
--auto-scaling-group-name prod-group \
--desired-capacity $((INSTANCE_COUNT + 1))
fi
Ключевые принципы, которые я соблюдаю:
- Безопасность: Всегда
set -euo pipefail, валидация входных данных, работа с секретами через менеджеры - Идемпотентность: Скрипты можно запускать многократно без побочных эффектов
- Логирование: Подробные логи с timestamp и уровнем важности
- Обработка ошибок: Грациозное завершение с понятными сообщениями
- Конфигурируемость: Параметризация через переменные окружения и конфиг-файлы
- Документация: Встроенная help-информация через
--help
Сложные кейсы, которые решал:
- Миграция БД с нулевым даунтаймом: Bash-оркестрация репликации, проверок согласованности и переключения трафика
- Распределенный сбор логов: Цепочка скриптов для агрегации и ротации логов на 100+ серверах
- Кастомный балансировщик трафика: Скрипт на
socat+iptablesдля специфичных требований нагрузки - Автоматическое восстановление кластеров: Самовосстанавливающаяся система на основе Health Check
Bash остается незаменимым инструментом в арсенале DevOps-инженера, особенно для задач, требующих глубокой интеграции с ОС и максимальной производительности. Однако для сложных систем сегодня я часто комбинирую Bash с Python или Go, используя каждый инструмент для решения наиболее подходящих задач.