← Назад к вопросам

Какие скрипты писал на 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

Ключевые принципы, которые я соблюдаю:

  1. Безопасность: Всегда set -euo pipefail, валидация входных данных, работа с секретами через менеджеры
  2. Идемпотентность: Скрипты можно запускать многократно без побочных эффектов
  3. Логирование: Подробные логи с timestamp и уровнем важности
  4. Обработка ошибок: Грациозное завершение с понятными сообщениями
  5. Конфигурируемость: Параметризация через переменные окружения и конфиг-файлы
  6. Документация: Встроенная help-информация через --help

Сложные кейсы, которые решал:

  • Миграция БД с нулевым даунтаймом: Bash-оркестрация репликации, проверок согласованности и переключения трафика
  • Распределенный сбор логов: Цепочка скриптов для агрегации и ротации логов на 100+ серверах
  • Кастомный балансировщик трафика: Скрипт на socat + iptables для специфичных требований нагрузки
  • Автоматическое восстановление кластеров: Самовосстанавливающаяся система на основе Health Check

Bash остается незаменимым инструментом в арсенале DevOps-инженера, особенно для задач, требующих глубокой интеграции с ОС и максимальной производительности. Однако для сложных систем сегодня я часто комбинирую Bash с Python или Go, используя каждый инструмент для решения наиболее подходящих задач.