Ansible lintの設定ファイルについて

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

Ansible lintは設定ファイルにより挙動を変更できます。例えば適用するルールをskipしたり検査をしないファイルを設定したり独自のルールを導入したり等のことができます。

設定ファイルはプロジェクトディレクトリの`.ansible-lint`か`.config/ansible-lint.yml`に配置します。

Galaxy roleのディレクトリ構造の例

```shell
.
├── .ansible-lint
├── .cache/
├── .github/
├── .yamllint
├── README.md
├── defaults
│   └── main.yml
├── meta
│   └── main.yml
└── tasks
    └── main.yml
```

以下は設定できる項目です。

### enable_list

Ansible lintでは`opt-in`タグに分類されているルールは初期設定では実行されません。`enable_list`へ加えることで実行されるようになります。

```yaml
enable_list:
  - empty-string-compare # opt-in
  - no-log-password # opt-in
  - no-same-owner # opt-in
  - name[prefix] # opt-in
```



### exclude_paths

Ansible lintを`適用しない`ファイルを設定します。ファイルは`.ansible-lint`からの相対パスで記述します。

```yaml
exclude_paths:
  - .cache/
  - .github/
  - test/fixtures/formatting-before/
  - test/fixtures/formatting-prettier/
```

### extra_vars

シンタックスチェック時に変数の設定が必要な場合Ansible lintの設定ファイルで変数の設定ができます。

```yaml
extra_vars:
  foo: bar
  multiline_string_variable: |
    line1
    line2
  complex_variable: ":{;\t$()"
```

### kinds

検査対象のファイルを追記します。Ansible lintは自動でコンテンツファイルを探しますが全てのコンテンツを見つけられるわけではありません。コンテンツとして扱いたいファイルのパスを`kinds`へ記述する事でAnsible lintがコンテンツを確実に見つけます。

```yaml
  - playbook: "**/examples/*.{yml,yaml}"
  - galaxy: "**/folder/galaxy.yml"
  - tasks: "**/tasks/*.yml"
  - vars: "**/vars/*.yml"
  - meta: "**/meta/main.yml"
  - yaml: "**/*.yaml-too"
```

### loop_var_prefix

変数をloopして利用する際にprefixを付与するように強制します。例えばloop_var_prefixに`hoge_`を設定した場合、`loop_var`が`hoge_`から始まらないとエラーになります。

Ansibleのベストプラクティスとしては **loopで変数を扱う場合は`loop_var`へ`prefix`を付与すべし** なのだと思われます。


```yaml
command: echo {{ zj_number }}
loop:
  - one
  - two
  - three
loop_control:
  loop_var: hoge_number
```

### mock_modules・mock_roles

モックを明示的に記述します。Mockに指定されたRoleやModuleにもAnsible lintは適用されます。

```yaml
mock_modules:
  - zuul_return
  # note the foo.bar is invalid as being neither a module or a collection
  - fake_namespace.fake_collection.fake_module
  - fake_namespace.fake_collection.fake_module.fake_submodule
mock_roles:
  - mocked_role
  - author.role_name # old standalone galaxy role
  - fake_namespace.fake_collection.fake_role
```

### offline

インターネット接続がない環境下で`requirements.yml`のroleをインストールする挙動を制御します。初期値は`false`でオンラインモードなのでAnsible lint実行時に`requirements.yml`のRoleを自動でインストールします。

```yaml
offline: false
```

### profile

Ansible lintのプロファルを設定します。初期値はnullですが実際は`production`が設定されています。

```yaml
profile: null # min, basic, moderate,safety, shared, production
```

### progressive

Gitでの開発が前提です。前回のcommit時と内容を比べ１つでもルール違反が少なくなっていればsuccessを返します。初期値はこの機能は無効になっています。

```yaml
progressive: false
```

### skip_list

適用しないルールもしくはタグを設定します。ここに指定されたルールもしくはタグは実行されません。

```yaml
skip_list:
  - var-naming
```

### use_default_rules および rulesdir

初期設定ではAnsible lintが提供するルールのみ利用する設定になっています。

```yaml
use_default_rules: true
```

独自ルールを利用する場合は`rulesdir`でルールのファイルが置いてあるディレクトリを指定します。

```yaml
rulesdir:
  - ./rule/directory/
```

### var_naming_pattern

変数名のパターンを指定します。パターンには正規表現が利用できます。

Ansible lintの変数名は`数字`・`アルファベットの小文字`・`アンダーバー`が利用でき、最初の文字は`アルファベットの小文字`および`アンダーバー`となっています。これは`var_naming_pattern`の定義によるものです。

この設定を無効化するには設定ファイルの`skip_list`の項目に`var-naming`を加えます。

```yaml
var_naming_pattern: "^[a-z_][a-z0-9_]*$"
```

### warn_list

`warn_list`に設定されたルールおよびタグは検査は実行されますが結果がエラーでも警告になります。

```yaml
warn_list:
  - skip_this_tag
  - yaml[document-start]  # you can also use sub-rule matches
```

### write_list

`ansible-lint --write`コマンドの挙動を制御します。初期設定では`all`です。`write_list: ["none"]`に設定すると`ansible-lint --write`コマンドが無効化されます。

```yaml
write_list:
  - all
```

### 参考サイト

* [Configuration — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/configuring/)