Линтинг SLS
Тема дорожной карты · SaltStack
salt-lint — это статический анализатор SLS-файлов, поддерживаемый компанией Warpnet. Он работает аналогично ansible-lint, находя ошибки в коде состояний до их применения на мастере. Линтер анализирует исходный текст файла без необходимости в мастере, миньонах или рендеринге Jinja, что делает проверку быстрой и удобной для интеграции в pre-commit-хуки и CI. Это первый рубеж обороны в пирамиде тестирования Salt: он не проверяет логику состояний, но эффективно отсекает механические ошибки, такие как неправильные отступы или секреты, закоммиченные в открытом виде.
Как это работает
Установка производится командой pip install salt-lint. Запуск можно выполнить с помощью команды salt-lint init.sls для одного файла или git ls-files '*.sls' | xargs salt-lint для всего дерева файлов. Анализатор разбирает файлы как текст, учитывая YAML и Jinja-синтаксис, и применяет набор пронумерованных правил, включающих проверку висячих пробелов, слишком длинных строк, числовых режимов файлов без кавычек (что может вызвать проблемы с восьмеричными числами в YAML), устаревший синтаксис и подозрительные места, такие как пароли в открытом виде. При обнаружении ошибок анализатор возвращает ненулевой код выхода, что приводит к провалу CI-джобы. Поведение линтера настраивается с помощью файла .salt-lint в корне репозитория, где можно указать список игнорируемых правил (skip_list) и исключаемые пути. Индивидуальные правила можно глушить с помощью инлайн-комментария # noqa с номером правила. Для машинной обработки доступен вывод в JSON, а для локальной автоматизации проект публикует готовый pre-commit-хук.
Когда применять
Линтер следует использовать всегда, когда SLS-файлы находятся в Git и редактируются несколькими людьми, — то есть в любом непустом репозитории состояний. Типичная схема применения двухступенчатая: линтер срабатывает в pre-commit-хуке локально, ловя ошибки до коммита, а в CI тот же прогон выполняется обязательным шагом на каждый push, защищая от тех, у кого хуки не установлены. Важно помнить, что salt-lint не рендерит Jinja и не знает ваших pillar-значений, поэтому он не заметит обращение к несуществующему ключу или ошибку в логике цикла. Для этого нужен следующий уровень — рендер-проверка через state.show_sls и полноценные тесты состояний. Линтер отвечает на вопрос «аккуратен ли код», а не «работает ли он».
Типичные ошибки
Основная ошибка — включение линтера на большом легаси-репозитории сразу в блокирующем режиме, что приводит к сотням предупреждений и красному CI у всех, и через неделю проверку просто отключают. Правильный путь — начать с skip_list на самые шумные правила и включать их обратно по мере чистки. Вторая ошибка — противоположная: расставлять # noqa на всё подряд, превращая линтер в декорацию; каждое подавление должно быть осознанным. Третья ошибка — прогонять только изменённые файлы: правка общего Jinja-макроса может сломать SLS, которого нет в диффе, поэтому полный прогон дешевле разбирательств. И не забывайте пиннить версию линтера в CI — новые правила в свежем релизе не должны внезапно красить пайплайн.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- non-zero /ˌnɒn ˈzɪəroʊ/ ненулевой код возврата разбор: Ошибки терминала: permission denied, no such file, segfault
- comment /ˈkɒmɛnt/ ударение на первый слог, а не «коммЕнт» разбор: Где встречается: код, доки, тикеты, созвоны
- pyramid /ˈpɪrəmɪd/ ударение на первый слог разбор: Тестирование: flaky, coverage, mock, fixture, regression
- mandatory /ˈmændətəri/ обязательный разбор: Читаем man pages: SYNOPSIS, OPTIONS, скобки
- release /rɪˈliːs/ ударение на второй слог, «релис», а не «релиз» с русским «з» разбор: Версии и числа: two point oh, semver
- commit /kəˈmɪt/ ударение на второй слог разбор: Словарь IT-рунглиша
- repository /rɪˈpɒzɪtəri/ ударение на «по», четыре слога, а не «репозитОри» разбор: Где встречается: код, доки, тикеты, созвоны