TGViewer
NetworkAdmin.ru NetworkAdmin.ru @networkadminru · 4.7K subscribers
Post #864 1.51K
🤔 Idempotency: как не сломать прод повторным запуском

Один из самых опасных админских сценариев выглядит очень буднично: скрипт уже запускали один раз, потом кто-то запускает его снова и внезапно в проде начинается хаос. Повторно создаются пользователи, дублируются правила, ломаются конфиги, повторно накатываются миграции, сервис получает совсем не то состояние, которое ожидалось.

Именно здесь важна идемпотентность. Идемпотентный сценарий - это когда команду, скрипт или 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 -p
ln -sfn вместо слепого ln -s
шаблоны конфигов вместо бесконечного echo >>
явная логика: если уже сделано - пропусти
аккуратная работа с exit code

Очень частая ошибка - считать, что скрипт нормальный, если он успешно отработал один раз.

На самом деле хороший продовый скрипт должен спокойно переживать: повторный запуск, частично выполненный запуск, перезапуск после ошибки и запуск на хосте, где что-то уже настроено

Идемпотентность не означает, что скрипт вообще ничего не делает при повторном запуске. Она означает, что он не вносит лишних изменений и не уводит систему в другое состояние. Когда automation пишется без этого принципа, любой повторный запуск превращается в лотерею.

#linux #automation

🧑‍💻 NetworkAdmin
  • 👍 8
More from @networkadminru
  1. Sep 29, 2026🥱 Как быстро разобраться с дисками и маунтами Когда на сервере несколько дисков, LVM, отд…
  2. Sep 28, 2026🔎 TCP keepalive: как находить мертвые соединения до того, как они создадут проблему Иногд…
  3. Sep 25, 2026🤩 Как расшифровать код ошибки Windows через certutil При установке обновлений Windows ран…
  4. Sep 23, 2026💻 Как жестко перезагрузить linux, когда обычный reboot уже не помогает Иногда сервер зави…
  5. Sep 22, 2026🌚 watch: простая динамическая диагностика в терминале Иногда не нужен отдельный мониторин…
  6. Sep 21, 2026👌 Firewall default deny: как внедрять без внезапного отрезания доступа Идея простая: разр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →