Внешние pillar
Тема дорожной карты · SaltStack
External pillar — механизм, который позволяет собирать pillar-данные не из SLS-файлов на диске мастера, а из внешних систем: git-репозитория, HashiCorp Vault, Consul, etcd, SQL-базы, HTTP-эндпоинта, отдающего JSON. Модель доступа при этом не меняется: внешний модуль выполняется на мастере, получает id конкретного миньона и возвращает словарь именно для него — миньон по-прежнему видит только своё и не может дотянуться до внешней системы напрямую. Это ключевое отличие от «скачать конфиг curl'ом в state»: учётные данные для доступа к Vault или базе есть только у мастера, парку они не выдаются. External pillar превращает pillar из статического дерева файлов в интерфейс: SLS-файлы остаются для рукописных данных, а всё, что уже живёт в CMDB, хранилище секретов или инвентори, подключается на лету.
Как это работает
Внешние источники объявляются в конфигурации мастера списком ext_pillar:
ext_pillar:
- git:
- main https://git.example.com/pillar.git
- vault: path=secret/salt
Каждый элемент — имя pillar-модуля и его параметры; модулей в комплекте десятки (их перечень — в индексе salt.pillar.* документации). При компиляции pillar мастер сначала рендерит обычное дерево из pillar_roots, затем по порядку вызывает каждый ext_pillar-модуль, передавая ему minion id и уже собранный словарь; результаты сливаются в общую структуру. Порядок можно обратить опцией ext_pillar_first: True — тогда файловый pillar накладывается поверх внешнего и может переопределять его значения. Для миньона всё прозрачно: pillar.items показывает объединённый результат, и saltutil.refresh_pillar нужен после изменений во внешнем источнике точно так же, как после правки файлов. Свой источник пишется как Python-модуль с функцией ext_pillar(minion_id, pillar, *args), возвращающей словарь; кладётся он в каталог из extension_modules мастера.
Когда применять
Подключайте external pillar, когда данные уже имеют другой источник истины и копировать их в SLS-файлы означало бы вечную рассинхронизацию. Типовые сценарии: секреты в Vault (ротация и аудит на стороне хранилища), pillar-репозиторий в git без выкладки файлов на мастер (модуль git — фактический стандарт для команд с ревью через PR), параметры хостов из CMDB или базы, динамические списки из service discovery. Если же данные статичны и правятся руками, обычные SLS проще: их видно целиком, они не зависят от доступности внешних сервисов. Смешанная схема — норма: файлы для структуры и несекретных значений, Vault для паролей.
Типичные ошибки
Главный риск — доступность: недоступный Vault или битый git-репозиторий означает неполный pillar, и state.apply начнёт падать на недостающих ключах (или, что хуже, молча применит дефолты из pillar.get). Закладывайте мониторинг источников и осмысленные default'ы. Вторая ошибка — конфликты ключей между файловым и внешним pillar: кто кого перезапишет, зависит от ext_pillar_first и стратегии слияния, и отлаживать это вслепую мучительно — держите пространства ключей раздельными. Третья — медленный внешний источник: он вызывается при каждой компиляции pillar каждого миньона, и task-очередь мастера деградирует; смотрите в сторону кэширования. Наконец, не забывайте, что refresh_pillar нужен и после изменений во внешней системе.
Связанные понятия
Полезные ресурсы
Проверить знания (2)
Загрузка вопросов…