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

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

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

  • обнаружить синтаксические ошибки до запуска playbook;
  • соблюсти единый стиль кода;
  • выявить потенциальные уязвимости;
  • интегрировать в CI/CD для автоматической проверки перед деплоем.командам с разделением ролей (разработчики VS админы VS безопасность).

Популярные линтеры для 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  

FAQ:

Читайте также: