Вне git-репозитория инструмент ничего не делает
Это не проверка для удобства, а несущее ограничение. На нём держатся журнал изменений, откат и безопасность работы нескольких человек.
Любое действие, которое трогает состояние инфраструктуры, обязано происходить внутри каталога под контролем git. Любое изменяющее действие — на чистом рабочем дереве или с явным флагом-исключением.
Это не удобная проверка, которую можно отключить. Это несущее ограничение, из которого выводится всё остальное.
Что оно даёт
Журнал изменений. Каждое применение привязано к коммиту. Вопрос «кто и когда изменил эту машину» имеет ответ, и ответ не зависит от того, включал ли кто-то логирование.
Откат. Раз состояние описано файлами в репозитории, предыдущее состояние — это предыдущий коммит. Откат перестаёт быть отдельной функцией продукта.
Безопасность в команде. Двое не применяют разные версии одного описания, потому что версия — это коммит, а расхождение видно до применения.
Почему именно жёсткое требование
Мягкий вариант — предупреждение вместо отказа — не работает. Предупреждение читают один раз, потом привыкают. Через месяц половина применений идёт с грязным деревом, и журнал изменений превращается в набор записей «применено что-то похожее на этот коммит».
Отказ неудобен ровно в тот момент, когда торопишься. Именно в этот момент он и нужен.
Флаг-исключение всё-таки есть
Есть, и это сознательный компромисс. Бывают ситуации — авария, отладка, разовая проверка, — когда требование мешает по делу.
Разница в том, что исключение надо назвать явно. Оно попадает в журнал вместе с фактом, что дерево было грязным. То есть последствие не в том, что нельзя, а в том, что видно.
Как ограничение работает на двух треках
Инструмент поддерживает два способа доставки, и требование git одинаково для обоих, а вот стиль сверки разный.
Простой трек — виртуальная машина и контейнеры через compose — работает императивно: инструмент читает закоммиченное состояние и выполняет команды. Никакого непрерывного цикла сверки здесь нет.
Производственный трек — Talos Linux, Cluster API, Helm — работает декларативно: жизненным циклом кластера управляет Cluster API, а всеми нагрузками владеет ArgoCD. Инструмент здесь дирижёр, а не исполнитель.
Одинаковые предварительные проверки, разная механика после них.
Что нельзя коммитить
Обратная сторона правила. Раз в репозиторий уходит описание, туда не должно уходить состояние с секретами.
Файлы состояния Terraform в проекте защищены отдельной проверкой: если такой файл оказался в индексе или в истории, применение и удаление отклоняются с собственным кодом ошибки. Не предупреждением — отказом.
Причина та же, что и с грязным деревом. Файл состояния Terraform содержит достаточно, чтобы им можно было навредить, и попадает он в репозиторий всегда случайно.
Стоимость решения
Инструмент невозможно попробовать «просто в папке». Нужен git init — минимальный, но обязательный шаг.
Мы считаем это правильным входным барьером. Инфраструктура, которую не отслеживает система контроля версий, всё равно превратится в проблему; лучше это обнаружить в первую минуту знакомства, а не через полгода эксплуатации.