GitFS
Тема дорожной карты · SaltStack
GitFS — это бэкенд файлового сервера, который предоставляет миньонам файлы напрямую из git-репозиториев, минуя каталоги на диске мастера. Ключевая особенность: ветки и теги репозитория автоматически становятся окружениями (saltenv). Например, ветка dev даёт окружение dev, тег v1.2 — окружение v1.2, а ветка master по умолчанию отображается в base. Это позволяет управлять конфигурацией через обычный git-flow: изменение состояния — это коммит, продвижение между окружениями — merge, ревью — merge request. Мастер сам клонирует репозитории, кэширует их локально и периодически обновляет; вручную на мастер ничего выкладывать не нужно.
Как это работает
В конфиге мастера включается бэкенд и перечисляются репозитории:
fileserver_backend:
- gitfs
gitfs_remotes:
- ssh://git@git.example.com/salt/states.git
Работу с git выполняет провайдер — pygit2 (рекомендуемый, на базе libgit2) или GitPython, выбирается опцией gitfs_provider. Для ssh-доступа у pygit2 задаются gitfs_pubkey и gitfs_privkey. Мастер хранит кэш репозиториев в /var/cache/salt/master/gitfs и обновляет его фоновым процессом обслуживания файлового сервера; принудительно — salt-run fileserver.update. Каждая ветка и каждый тег видны как отдельный saltenv; какая ветка считается base, задаёт gitfs_base, а лишние окружения отсекаются через gitfs_saltenv_whitelist / gitfs_saltenv_blacklist. Несколько remote'ов накладываются друг на друга по порядку списка — первый выигрывает при совпадении путей; per-remote параметры root и mountpoint позволяют отдать подкаталог репозитория или смонтировать его в подпуть salt://.
Когда применять
GitFS — стандарт для команд, где инфраструктурный код проходит ревью: вся история изменений в git, выкатка в окружение — это merge в соответствующую ветку, откат — revert. Особенно удобно с формулами: каждую формулу подключают отдельным remote'ом в gitfs_remotes, пиня нужную версию, вместо копирования кода в своё дерево. Хорошо работает и гибрид: fileserver_backend: [roots, gitfs] — основная база из git, а локальный /srv/salt для экстренных патчей (помня, что roots первым в списке перекрывает git). Для одиночного мастера с парой десятков миньонов GitFS может быть избыточен — связка «roots + CI, выкладывающий репозиторий на мастер» даёт тот же git-flow без зависимостей от pygit2.
Типичные ошибки
Самая частая проблема — окружение зависимостей: pygit2 и libgit2 должны быть согласованных версий и установлены в то же окружение Python, где работает мастер (в onedir-пакетах — через salt-pip); иначе GitFS молча не стартует, и диагноз виден только в логе мастера. Вторая — забыть про задержку кэша: свежий push становится виден миньонам не мгновенно, а после очередного обновления файлового сервера, поэтому «закоммитил, применил, изменений нет» — это обычно не баг, а кэш; выручает salt-run fileserver.update. Третья — путать GitFS с git-pillar: pillar из git настраивается отдельно через ext_pillar, gitfs_remotes на pillar не влияет. Наконец, ssh-доступ без корректных ключей и известных хостов даёт невнятные ошибки аутентификации — проверяйте клонирование тем же ключом вручную.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- maintenance /ˈmeɪntənəns/ первый, «мейнтэнэнс», не «мейнтЕнанс» разбор: Немые буквы и ударение: cache, queue, suite, height
- merge /mɜːrdʒ/ один слог, «мёрдж», без русского «е» разбор: Рунглиш vs английский: когда что уместно
- compatible /kəmˈpætəbl/ ударение на второй слог, «кэмпЭтэбл» разбор: Читаем changelog: breaking change, deprecated, hotfix, backport
- remote /rɪˈmoʊt/ ударение на второй слог разбор: Что носители скажут иначе: айтишник, сеньор, проект
- repo /ˈrɛpoʊ/ «репоу» разбор: Английский Git и code review
- commit /kəˈmɪt/ ударение на второй слог разбор: Словарь IT-рунглиша
- repository /rɪˈpɒzɪtəri/ ударение на «по», четыре слога, а не «репозитОри» разбор: Где встречается: код, доки, тикеты, созвоны