Ansible lintとは？

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 1日目の記事になります。

今回はAnsible lintとは何かについて解説します。

### Ansible lintとは

Ansible playbook、role、collectionsを開発するためのコマンドライン型のlintツールです。lintツールとはコードが

* ベストプラクティスに準じて記述されているか
* バグにつながりやすい記述方法が紛れ込んでないか
* コード等に脆弱性が入り込んでいないか

などを検査する静的解析ツールです。Ansible lintの製品のコンセプトとしては [black](https://github.com/psf/black) や [prettier](https://prettier.io) の影響を強く受けていると言う事です。

### Ansible lintの哲学

以下Ansible lintの[ウェブサイト](https://ansible-lint.readthedocs.io/philosophy/)からの**意訳**です。


* Ansible playbooks、roles、およびcollections(以下Ansibleコンテンツと同義）は、ドキュメントのように読むことができ、曖昧さがなく、記述した通りに実行され、一貫した結果(冪等性と同義と思われる）を提供する

* Ansible-lintは、Ansibleコンテンツの作成者がコンテンツを作成し、パッケージ化するための信頼すべき指針となるべきである

* AnsibleコンテンツではAnsible lintが提示する全てのルールが適応されるべきであるとは限らないが、可能な限りAnsible lintの提示するルールに従うべきである

* Ansible lintの目標は、異なる人々によって作成されたコンテンツが、似たような馴染みのある記述方法で作成される事を保証する。これにより、コミュニティや企業において、Ansibleコンテンツの採用や利用を容易にする

### 動作環境

Ansible lintのドキュメント等に明確には書いてありません。しかしAnsible lintの[GitHubリポジトリ](https://github.com/ansible/ansible-lint)のCI環境から推測するにPython 3.8以降が必要になります。

記事執筆時で最新バージョンのAnsible lint 6系より古いバージョンを利用する場合は[GitHubリポジトリ](https://github.com/ansible/ansible-lint)のテストの実行ファイルを確認してみてください。

```yaml:.github/workflows/tox.yml
.
.
.
 unit:
    name: ${{ matrix.name || matrix.tox_env }}
    runs-on: ${{ matrix.os }}
    defaults:
      run:
        shell: ${{ matrix.shell || 'bash'}}
    strategy:
      fail-fast: false
      # max-parallel: 5
      # The matrix testing goal is to cover the *most likely* environments
      # which are expected to be used by users in production. Avoid adding a
      # combination unless there are good reasons to test it, like having
      # proof that we failed to catch a bug by not running it. Using
      # distribution should be preferred instead of custom builds.
      matrix:
        name:
          - py38
        tox_env:
          - py38
        python-version:
          - 3.8
        os:
          # https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
          - ubuntu-20.04
        # - windows-latest
        # - windows-2016
        include:
          # keep list sorted as it determines UI order too
          # linux
          # py38 is first and comes from matrix
          - tox_env: py38
            os: ubuntu-20.04
            python-version: 3.8
            devel: false # ansible 2.14 removed support for py38
          - tox_env: py39
            os: ubuntu-20.04
            python-version: 3.9
            devel: true
          - tox_env: py310
            os: ubuntu-20.04
            python-version: "3.10"
            devel: true
          - tox_env: py311
            os: ubuntu-20.04
            python-version: "~3.11.0-0" # see https://github.com/actions/setup-python/issues/213#issuecomment-1146676713
            devel: true
          # macos
          - name: py38 (macos)
            tox_env: py38
            os: macOS-latest
            python-version: 3.8
          - name: py310 (macos)
            tox_env: py310
            os: macOS-latest
            python-version: "3.10"
          # windows-2022 WSL does timeout running tests, likely caused but some
          # extreme (>10x) performance degradation compared with windows-2019
          # https://github.com/actions/virtual-environments/issues/4856
          - name: py39 (wsl)
            tox_env: py39
            os: windows-2019
            shell: "wsl-bash {0}"
.
.
.

```

### インストール方法

pipによりインストールします。以下のコマンドによりAnsible lintおよびAnsible coreがインストールされます。

```bash
pip3 install ansible-lint

## もしくは

pip3 install git+https://github.com/ansible-community/ansible-lint.git
```

しかしAnsible lintの機能を全て利用する場合は[Ansible Community Package](https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html)も必要になるため[Ansible Community Package](https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html)もあわせてインストールします。

```bash
pip3 install ansible-lint ansible
```