Подписка на курсы Слёрма: 21 курс в полном доступе
Блог Слёрм

Линтеры в Ansible: как писать чистый и надёжный код

Ansible решает много задач, но даже в простых плейбуках можно допустить ошибки. Линтеры помогают находить проблемы до запуска в продакшен, делая код стабильным и читаемым.

Использовать линтеры в Ansible нужно, чтобы:

✅ обнаружить синтаксические ошибки до запуска playbook;

✅ соблюсти единый стиль кода;

✅ выявить потенциальные уязвимости;

✅ интегрировать в CI/CD для автоматической проверки перед деплоем.

Популярные линтеры для Ansible

1️⃣ ansible-lint – основной линтер для Ansible

Проверяет:

  • синтаксис YAML;
  • идемпотентность (например, command вместо shell, где возможно);
  • использование устаревших модулей;
  • рекомендации по безопасности.

Установка:
pip install ansible-lint
Запуск:
ansible-lint playbook.yml
2️⃣ yamllint – проверка YAML-синтаксиса

Ansible использует YAML, и yamllint помогает избежать:

  • некорректных отступов;
  • избыточных строк;
  • неправильного форматирования.

Установка:
pip install yamllint
Запуск:
yamllint .
3️⃣ molecule test – тестирование ролей

Хотя Molecule — не линтер, он помогает:

  • проверять роли в изолированном окружении;
  • тестировать идемпотентность;
  • интегрировать линтинг в процесс разработки.

Пример:
molecule test --scenario-name default
Как интегрировать линтинг в CI/CD?

Пример для GitHub Actions:
name: Ansible Linting  
on: [push, pull_request]  
jobs:  
  lint:  
    runs-on: ubuntu-latest  
    steps:  
      - uses: actions/checkout@v4  
      - name: Run ansible-lint  
         run: pip install ansible-lint && ansible-lint  
      - name: Run yamllint  
        run: pip install yamllint && yamllint .
Лучшие практики

  • линтить перед каждым коммитом – можно через Git Hooks;
  • использовать ansible-lint в CI – чтобы код в репозитории всегда был чистым;
  • настроить IDE – плагины для VSCode (Ansible, YAML) подсвечивают ошибки на лету.

Пример исправления ошибки

До (проблема: модуль shell, выполняет команды напрямую без проверки состояния.)
- name: Restart service (unsafe)  
  shell: systemctl restart nginx  
После (рекомендуемый вариант - модуль ansible.builtin.service, так как он обеспечивает идемпотентность и обработку ошибок):
- name: Restart service (safe)  
  ansible.builtin.service:  
    name: nginx  
    state: restarted  
Узнать больше о линтерах и научиться работать с ними вы можете на курсе «Ansible: Infrastructure as Code». Старт 28 апреля. Все подробности по ссылке.
Ansible