Переменные, условия и циклы для автоматизации задач - DevOps с нуля: Путь к автоматизации и CI/CD - Qpel.AI

Переменные, условия и циклы для автоматизации задач

В прошлых модулях вы освоили базовые команды Linux и научились управлять системой. Теперь пора двигаться дальше: автоматизировать рутинные задачи. Здесь на помощь приходит Bash-скриптинг — мощный инструмент, который превратит последовательность команд в исполняемый сценарий.

Что такое Bash-скриптинг и зачем он DevOps-инженеру?

Bash-скриптинг — это написание сценариев (скриптов) для командной оболочки Bash (Bourne Again SHell). Она стандартна для большинства дистрибутивов Linux. Скрипты автоматизируют повторяющиеся задачи:

  • Резервное копирование данных: Создают архивы и перемещают их в удалённое хранилище.
  • Установка и настройка ПО: Разворачивают приложения и их зависимости.
  • Мониторинг системы: Проверяют состояние сервисов, свободное место на диске, загрузку CPU.
  • Управление файлами: Сортируют, переименовывают, удаляют файлы по заданным критериям.
  • Развёртывание приложений: Автоматизируют шаги деплоя на серверы.

Для DevOps-инженера умение писать Bash-скрипты — это фундамент для создания сложных систем автоматизации и CI/CD пайплайнов. Это ваш первый шаг к тому, чтобы перестать выполнять одни и те же действия вручную и начать мыслить категориями «инфраструктура как код» (IaC).

Переменные: храним данные в скриптах

Переменные в Bash хранят значения, которые меняются в процессе выполнения скрипта. Это делает скрипты гибкими и многоразовыми.

Объявление и использование переменных

Чтобы объявить переменную, просто присвойте ей значение:

NAME="Михаил"
AGE=30
PATH_TO_LOGS="/var/log/app"

Важно: Между именем переменной, знаком = и значением не должно быть пробелов.

Для доступа к значению переменной используйте знак $ перед её именем:

echo "Привет, $NAME! Тебе $AGE лет."
echo "Логи находятся здесь: $PATH_TO_LOGS"

Пример: Создадим скрипт hello.sh, который приветствует пользователя.

  1. Создайте файл: nano hello.sh
  2. Добавьте содержимое:
    #!/bin/bash
    
    # Это комментарий. Все, что начинается с #, игнорируется.
    
    USER_NAME="Пользователь"
    echo "Привет, $USER_NAME!"
    
    # Можно запросить ввод у пользователя
    read -p "Как вас зовут на самом деле? " REAL_NAME
    echo "Очень приятно, $REAL_NAME!"
    
  3. Сделайте скрипт исполняемым: chmod +x hello.sh
  4. Запустите: ./hello.sh

Специальные переменные

Bash предоставляет несколько полезных встроенных переменных:

  • $0: Имя текущего скрипта.
  • $1, $2, ...: Позиционные параметры, переданные скрипту.
  • $#: Количество переданных параметров.
  • $@: Все переданные параметры как отдельные строки.
  • $*: Все переданные параметры как одна строка.
  • $?: Код выхода последней выполненной команды (0 – успех, >0 – ошибка).

Пример: Скрипт args.sh для работы с аргументами.

#!/bin/bash

echo "Имя скрипта: $0"
echo "Количество аргументов: $#"
echo "Первый аргумент: $1"
echo "Второй аргумент: $2"
echo "Все аргументы как отдельные строки: $@"
echo "Все аргументы как одна строка: $*"

Запустите: ./args.sh alpha beta gamma

Условия: принимаем решения в скриптах

Условные конструкции позволяют скриптам выполнять разные действия в зависимости от выполнения условий.

Конструкция if-then-else

Базовая структура:

if [ условие ]; then
    # Команды, если условие истинно
elif [ другое_условие ]; then
    # Команды, если другое_условие истинно
else
    # Команды, если ни одно из условий не истинно
fi

Важно: Пробелы вокруг квадратных скобок [] и внутри них обязательны!

Операторы сравнения

Для числовых сравнений:

  • -eq: равно
  • -ne: не равно
  • -gt: больше
  • -ge: больше или равно
  • -lt: меньше
  • -le: меньше или равно

Для строковых сравнений:

  • == или =: равно
  • !=: не равно
  • <: меньше (лексикографически)
  • >: больше (лексикографически)
  • -z: строка пуста
  • -n: строка не пуста

Для проверки файлов и каталогов:

  • -f: файл существует и является обычным файлом
  • -d: файл существует и является каталогом
  • -e: файл или каталог существует
  • -r: файл доступен для чтения
  • -w: файл доступен для записи
  • -x: файл доступен для выполнения

Пример: Скрипт check_file.sh, который проверяет наличие файла.

#!/bin/bash

FILE_NAME="test.txt"

if [ -f "$FILE_NAME" ]; then
    echo "Файл '$FILE_NAME' существует."
    if [ -w "$FILE_NAME" ]; then
        echo "Файл '$FILE_NAME' доступен для записи."
    else
        echo "Файл '$FILE_NAME' не доступен для записи."
    fi
else
    echo "Файл '$FILE_NAME' не существует. Создаем его..."
    touch "$FILE_NAME"
    echo "Файл '$FILE_NAME' создан."
fi

Циклы: повторяем действия

Циклы позволяют выполнять блок команд многократно.

Цикл for

Используется для итерации по списку элементов.

for ITEM in элемент1 элемент2 элемент3; do
    # Команды, использующие $ITEM
done

Можно также использовать генерацию последовательностей: for i in {1..5}; do ... done

Пример: Скрипт backup_dirs.sh, который создаёт резервные копии нескольких каталогов.

#!/bin/bash

DIRS_TO_BACKUP="/home/user/docs /var/www/html /etc/nginx"
BACKUP_DIR="/tmp/backups"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

for DIR in $DIRS_TO_BACKUP; do
    if [ -d "$DIR" ]; then
        ARCHIVE_NAME="$(basename "$DIR")_$DATE.tar.gz"
        echo "Создаем резервную копию $DIR в $BACKUP_DIR/$ARCHIVE_NAME"
        tar -czf "$BACKUP_DIR/$ARCHIVE_NAME" "$DIR"
    else
        echo "Каталог $DIR не существует, пропускаем."
    fi
done

echo "Резервное копирование завершено."

Цикл while

Выполняет блок команд, пока условие истинно.

while [ условие ]; do
    # Команды
done

Пример: Скрипт countdown.sh, который отсчитывает время.

#!/bin/bash

COUNT=5

while [ $COUNT -gt 0 ]; do
    echo "Осталось $COUNT..."
    sleep 1 # Ждем 1 секунду
    COUNT=$((COUNT - 1)) # Уменьшаем счетчик
done

echo "Старт!"

Совет: Используйте sleep в циклах для задержки выполнения. Это полезно при ожидании готовности сервисов или при работе с API, имеющими ограничения по частоте запросов.

Практическое задание: мониторинг свободного места

Создайте Bash-скрипт disk_monitor.sh, который:

  1. Принимает один аргумент — пороговое значение свободного места на диске в процентах (например, 20).
  2. Получает информацию о свободном месте на корневом разделе / с помощью команды df -h /.
  3. Извлекает процент использования диска.
  4. Если процент использования диска превышает заданный порог, выводит предупреждение.
  5. Если процент использования диска ниже порога, выводит сообщение, что всё в порядке.

Подсказка: Используйте awk или sed для извлечения нужного значения из вывода df. Например: df -h / | awk 'NR==2 {print $5}' | sed 's/%//'


Поздравляю! Вы сделали первый уверенный шаг в мир автоматизации с помощью Bash-скриптинга. Переменные, условия и циклы — это строительные блоки, которые позволят вам создавать мощные и гибкие сценарии.

В следующем разделе мы углубимся в работу с файлами и обработку ошибок в скриптах, что сделает ваши автоматизированные решения ещё более надёжными и функциональными. Готовы ли вы сделать свои скрипты по-настоящему устойчивыми?