Один из самых опасных админских сценариев выглядит очень буднично: скрипт уже запускали один раз, потом кто-то запускает его снова и внезапно в проде начинается хаос. Повторно создаются пользователи, дублируются правила, ломаются конфиги, повторно накатываются миграции, сервис получает совсем не то состояние, которое ожидалось.
Именно здесь важна идемпотентность. Идемпотентный сценарий - это когда команду, скрипт или automation можно запускать повторно, а результат будет тем же, что и после первого успешного запуска. Проще говоря: повторный запуск не должен ломать систему.
▪️ Где чаще всего все ломается:
useradd без проверки - пользователь уже существует
echo ... >> file - строки дублируются при каждом запускеmkdir dir без -p - ошибка на втором запускеправила firewall добавляются снова и снова
конфиг не заменяется, а “дописывается сверху”
миграция БД запускается повторно без защиты
▪️ Плохой пример:
echo "backup enabled" >> /etc/myapp.conf
useradd deploy
systemctl restart myapp
На первом запуске вроде все нормально. На втором в конфиге уже дубль, useradd падает, поведение становится непредсказуемым.
▪️ Более здоровый подход:
grep -q "^backup enabled$" /etc/myapp.conf || echo "backup enabled" >> /etc/myapp.conf
id deploy >/dev/null 2>&1 || useradd deploy
systemctl try-restart myapp
Смысл простой: сначала проверка состояния, потом изменение только если нужно.
Вот главный принцип идемпотентности в админке: не "сделай действие", а "приведи систему к нужному состоянию".
То есть не: создай каталог, добавь строку или создай пользователя
а: убедись, что каталог существует, убедись, что строка есть в конфиге, убедись, что пользователь создан.
Именно поэтому Ansible так любят: он по умолчанию мыслит состоянием, а не одноразовыми действиями.
▪️ Что помогает писать идемпотентные скрипты:
проверки перед изменением
безопасные команды вроде
mkdir -pln -sfn вместо слепого ln -sшаблоны конфигов вместо бесконечного
echo >>явная логика: если уже сделано - пропусти
аккуратная работа с exit code
Очень частая ошибка - считать, что скрипт нормальный, если он успешно отработал один раз.
На самом деле хороший продовый скрипт должен спокойно переживать: повторный запуск, частично выполненный запуск, перезапуск после ошибки и запуск на хосте, где что-то уже настроено
Идемпотентность не означает, что скрипт вообще ничего не делает при повторном запуске. Она означает, что он не вносит лишних изменений и не уводит систему в другое состояние. Когда automation пишется без этого принципа, любой повторный запуск превращается в лотерею.
#linux #automation
🧑💻 NetworkAdmin