include и extend
Тема дорожной карты · SaltStack
include и extend — два механизма композиции SLS-файлов в SaltStack. include подключает содержимое других SLS в текущий файл, объединяя все состояния в одну компиляцию. extend позволяет изменять состояния, объявленные в подключённых SLS, без редактирования этих файлов. Эти механизмы обеспечивают слоистую архитектуру, где базовые SLS описывают общее, а специализированные подключают и дополняют их. Однако extend требует осторожности, чтобы избежать нечитаемости конфигураций.
Как это работает
include указывается первым блоком в SLS и использует точечную нотацию для путей от корня окружения. Например, ssh.banner соответствует ssh/banner.sls. Относительные пути начинаются с точки, как в .config внутри nginx/init.sls, что означает nginx/config.sls. Повторное включение одного и того же SLS безопасно, так как каждый файл компилируется только один раз. После include можно ссылаться на состояния подключённых файлов в requisites, включая ссылку на весь файл: require: [{sls: ssh}].
Блок extend модифицирует включённые состояния по их ID:
include:
- ssh
extend:
ssh_config:
file:
- watch_in:
- service: my_custom_service
Расширяемый ID должен быть объявлен через include, иначе компиляция завершится ошибкой. Для добавления зависимостей можно использовать requisites с суффиксом _in (watch_in, require_in), что облегчает чтение конфигурации.
Когда применять
include используется повседневно: init.sls формулы включает install/config/service, профильный SLS «веб-сервер» включает nginx и certbot, а общий базовый слой (common) включается везде. Следует придерживаться правила, что SLS должен сам включать всё, от чего зависит, а не надеяться на подключение через top file.
extend уместен, когда нужно изменить поведение чужого кода без форка, например, заставить сервис из community-формулы перезапускаться при изменении дополнительного конфига. Однако перед использованием extend стоит проверить возможности параметризации через pillar или _in-requisites, которые более локальны и легче читаются.
Типичные ошибки
Классическая ошибка — extend без include, что приводит к ошибке компиляции. Вторая ошибка — объявление состояния с тем же ID заново вместо использования extend, что вызывает конфликт ID или создание дублирующих состояний. Третья ошибка — незаметная нелокальность: изменение состояния через extend из другого файла затрудняет отладку. Расширения следует документировать комментариями и держать к минимуму. Кроме того, extend может не всегда интуитивно объединять списки, поэтому после правок следует проверять результат через state.show_sls.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- comment /ˈkɒmɛnt/ ударение на первый слог, а не «коммЕнт» разбор: Где встречается: код, доки, тикеты, созвоны
- original /əˈrɪdʒɪnəl/ ударение на второй слог разбор: Ложные друзья: actual, data, accurate, control
- parameter /pəˈræmɪtər/ ударение на «рэ», не «парамЕтер» разбор: Как читать код вслух
- written /ˈrɪtn/ «ритн», двойное t произносится как одно, i краткое разбор: Письменная коммуникация
- result /rɪˈzʌlt/ ударение на второй слог разбор: Behavioral questions и метод STAR
- architecture /ˈɑːrkɪtɛktʃər/ ударение на первый слог, «Аркитекчер» разбор: Письменная коммуникация
- should /ʃʊd/ l немая разбор: Язык RFC: MUST, SHOULD, MAY (RFC 2119)