Mastering Ansible lint

Writing easy to maintain Ansible roles and playbooks is more of secret art that will take years to master. Product documentation is useful but is far from complete and lacks lots of hints.

Avoiding false positives

You can use noqa comments to disable specific rules. Be careful not to put them on multi-line YAML blocks as they will not be loaded as comments.

    - name: some ansible task
      # noqa 305 <-- correct
      shell: |
        env  # 305 <-- not correct

If the false positives are too many or if you are just in the process of adopting the linter, narrow down its scope:

# .ansible-lint
exclude_paths:
    - .travis.yml  # be careful not to exclude too much
skip_list:
    - 305  # Disable rule, include link to bug that forced you to disable it

Accessing Ansible modules from other repos

In the unlikely case where you would end up with ansible-lint errors caused by the fact that it fails to find some Ansible modules which may not even be located inside your own repository, I provide this hack for you which assures is able to find zuul_return module which is part of zuul Python package.

  - repo: https://github.com/ansible/ansible-lint.git
    rev: v4.1.1a0
    hooks:
      - id: ansible-lint
        files: \.(yaml|yml)$
        # Helps it find zuul_return module on both zuul and on dev environments,
        # Based on https://github.com/pre-commit/pre-commit/issues/758
        entry: >
          bash -c 'env ANSIBLE_LIBRARY=`python -c "import os, zuul;
          print(os.path.dirname(zuul.__file__))"`/ansible/base/actiongeneral/
          ansible-lint --force-color -v "$@"'
        exclude: playbooks/legacy
        additional_dependencies:
          - zuul