Для каких задач используют Bash-скрипты в DevOps?

Ответ

Bash-скрипты — это фундаментальный инструмент автоматизации в DevOps для выполнения рутинных операций на Unix-подобных системах (Linux, macOS).

Типичные сценарии использования:

  • Автоматизация сборки и деплоя: Запуск сборщиков (Maven, Gradle), копирование артефактов.
  • Обработка файлов и логов: Поиск, фильтрация (grep), преобразование (awk, sed), архивация.
  • Мониторинг и управление процессами: Проверка статуса служб, перезапуск упавших процессов, сбор метрик.
  • Управление инфраструктурой: Взаимодействие с облачными CLI (AWS CLI, gcloud), оркестрация контейнеров (Docker/Podman).

Пример скрипта для сборки и деплоя Java-приложения:

#!/bin/bash
# Strict mode для отлова ошибок
set -euo pipefail

PROJECT_DIR="/opt/myapp"
DEPLOY_DIR="/var/www/app"

echo "Начинаем сборку проекта..."
cd "$PROJECT_DIR"

# Запуск сборки с помощью Maven
mvn clean package -DskipTests

# Поиск и копирование JAR-артефакта
JAR_FILE=$(find target -name "*.jar" -type f | head -n 1)
if [[ -z "$JAR_FILE" ]]; then
    echo "Ошибка: JAR-файл не найден!" >&2
    exit 1
fi

cp "$JAR_FILE" "$DEPLOY_DIR/app.jar"
echo "Деплой успешно завершён: $DEPLOY_DIR/app.jar"

# Перезапуск системного сервиса
sudo systemctl restart myapp-service

Важные концепции: работа с переменными, аргументами скрипта ($1, $@), условиями (if-else), циклами (for, while), функциями и кодами возврата ($?).

Ответ 18+ 🔞

А, блядь, вот это тема! Bash-скрипты, сука! Это ж как палочка-выручалочка для любого деплоящегося в DevOps, который не хочет каждый раз руками эту хуйню делать. Представь: сидишь ты, такой, и вместо того чтобы двадцать команд в консоли вбивать, пишешь один скрипт — и он всё за тебя делает. Магия, ёпта!

Где эта штука реально спасает жопу:

  • Собрать и запихнуть куда надо: Запустил Maven или Gradle, нашёл свежеиспечённый JAR-файл и перетащил его на продакшн. Автоматически, блядь!
  • Ковыряться в файлах и логах: Найти нужную строчку в гигабайтном логе (grep), выдрать оттуда что-то умное (awk, sed) или склеить всё в архив. Руками — пиздец как долго.
  • Следить, чтобы всё не сдохло: Проверить, жива ли какая-нибудь служба, и если она легла — пнуть её, чтобы встала. Или метрики пособрать.
  • Дёргать облака и контейнеры: Через AWS CLI или gcloud накрутить инфраструктуру, а Docker-контейнеры поднять или прибить.

Смотри, как это примерно выглядит в деле, на примере простого скрипта для Java-приложения:

#!/bin/bash
# Включаем строгий режим, чтобы скрипт не молча проебался, а сразу сказал, где накосячил
set -euo pipefail

PROJECT_DIR="/opt/myapp"
DEPLOY_DIR="/var/www/app"

echo "Поехали собирать этот проект, блядь..."
cd "$PROJECT_DIR"

# Мавен, делай своё чёрное дело, только тесты пропусти
mvn clean package -DskipTests

# Теперь ищем, какой же JAR-файл этот умник нам нагенерил
JAR_FILE=$(find target -name "*.jar" -type f | head -n 1)
if [[ -z "$JAR_FILE" ]]; then
    echo "Ошибка: JAR-файл, сука, не найден! Что собирал-то?" >&2
    exit 1
fi

# Нашли — копируем куда надо
cp "$JAR_FILE" "$DEPLOY_DIR/app.jar"
echo "Всё, задеплоили! Лежит тут: $DEPLOY_DIR/app.jar"

# И сервис перезапускаем, чтобы изменения подхватились
sudo systemctl restart myapp-service

А теперь, чтобы не быть полным ламером, надо врубиться в основные штуки: Как с переменными работать (MY_VAR="value"), как аргументы скрипта ловить ($1 — первый аргумент, $@ — все сразу). Как условия писать (if [[ -f file.txt ]]; then...), как циклы гонять (for i in {1..5}; do...). Как свои функции объявлять и, самое главное, как проверять, что предыдущая команда не обосралась — через код возврата $?. Если ноль — всё заебись, если не ноль — пошло что-то не так.

Короче, выучишь это — и рутина перестанет быть пиздецом какой рутиной.