Всем привет, это Андрей Колесников! За 10 лет работы с высоконагруженными системами накопилось много мыслей про то, как мы управляем инфраструктурой, и мне кажется, нам надо поговорить про Puppet.
1️⃣ Границы инструмента решают всё.
Puppet у нас отвечает ровно за одно: держать конфигурацию серверов в актуальном состоянии в рамках IaC. Для одноразовых операций и быстрой раскатки есть Ansible. Когда каждая тулза знает своё место, жить становится сильно проще.
2️⃣ Pull-модель — это удобно и опасно одновременно.
Не нужно открывать 22-й порт, безопасники довольны. Но изменения расходятся по нодам асинхронно, раз в 30 минут. И когда что-то ломается, оно ломается не сразу везде, а расползается — отследить причину в моменте тяжело.
3️⃣ Про «что-то ломается» есть история из жизни.
Мы удаляли уже не используемый модуль dnsmasq, а dnsmasq-base оказался зависимостью LXC, на котором крутились ключевые инфраструктурные сервисы. В итоге снесли пакет — контейнеры остановились — несколько часов деградации. Один безобидный на вид коммит. После этого мы убрали автораскатку модулей на сервера, дополнили acceptance-тесты на все 100+ ролей и сделали канареечную выкатку: сначала ограниченный пул хостов, потом всё остальное.
4️⃣ И самое недооценённое — контрибьютят в Puppet-код не только DevOps.
Бэкендер, которому надо ускорить выкатку своего сервиса, может сам залезть в манифест. Для этого мы и пишем обёртки вроде iack — чтобы снизить порог входа, а не охранять экспертизу от всех подряд.
❓ А вы на чём держите конфиг? Обсудим в комментариях 👀