【ルール説明・basic】yaml

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

今回はルール[yaml](https://ansible-lint.readthedocs.io/rules/yaml/)について説明します。

### yaml

[yaml](https://ansible-lint.readthedocs.io/rules/yaml/)はYAMLファイルの構文をチェックするもので[yamllint](https://github.com/adrienverge/yamllint)を実行してファイルを検証します。

### 設定ファイルのパス

[yaml](https://ansible-lint.readthedocs.io/rules/yaml/)はAnsible lintと[yamllint](https://github.com/adrienverge/yamllint)の両方の設定ファイルで設定を行います。

[yamllint](https://github.com/adrienverge/yamllint)の設定ファイルは

* カレントディレクトリの`.yamllint`、`.yamllint.yaml` 、`.yamllint.yml`のいずれかのファイル
* 環境変数`YAMLLINT_CONFIG_FILE`で定義されたパス
* `~/.config/yamllint/config`

のいずれかになります。

### ルールを適用するファイルと適用するルールの設定

[yaml](https://ansible-lint.readthedocs.io/rules/yaml/)でルールを適用しないファイルを設定する場合は[yamllint](https://github.com/adrienverge/yamllint)の設定ファイルへ記述します。例えばyaml[line-length]を無効にしたい場合は

```yaml:.yamllint
---

yaml-files:
  - '*.yaml'
  - '*.yml'
  - '.yamllint'

rules:
  braces: enable
  brackets: enable
  colons: enable
  commas: enable
  comments:
    level: warning
  comments-indentation:
    level: warning
  document-end: disable
  document-start:
    level: warning
  empty-lines: enable
  empty-values: disable
  float-values: disable
  hyphens: enable
  indentation: enable
  key-duplicates: enable
  key-ordering: disable
  line-length:
    level: error
    ignore: |
      molecule/default/create.yml # <- ファイルのパスを指定する
  new-line-at-end-of-file: enable
  new-lines: enable
  octal-values: disable
  quoted-strings: disable
  trailing-spaces: enable
  truthy:
    level: warning
```

のように記述します。Ansible lintはAnsible lintで検証を行わないファイル名を設定する事は可能です。が現時点ではルールごとに検証を行わないファイル名を設定する事はできません。

また[yaml](https://ansible-lint.readthedocs.io/rules/yaml/)で特定のルールを有効にしたり無効にしたりする場合は[yamllint](https://github.com/adrienverge/yamllint)の設定ファイルへ記述します。Ansible lintの設定ファイルへ記述する事もできますが[yamllint](https://github.com/adrienverge/yamllint)の設定ファイルへ記述することで`適用するルール`と`ルールを適用するファイル`の両方を細かく設定できます。


### その他

CI等で[yamllint](https://github.com/adrienverge/yamllint)とAnsible lintを`それぞれ別々に実行する`際は[yamllint](https://github.com/adrienverge/yamllint)とAnsible lintで設定ファイルを分けた方が良い場合があります。

例えば[yamllint](https://github.com/adrienverge/yamllint)の[key-ordering](https://yamllint.readthedocs.io/en/stable/rules.html#module-yamllint.rules.key_ordering)が有効になっていてこれがAnsibleコンテンツへ適用された場合、Ansibleではkeyの順番は変更できないパターンがありAnsibleコンテンツのkeyの順番を変更してしまうとAnsibleを実行した時にエラーになる可能性があります。そのためAnsibleコンテンツへ実行する[yamllint](https://github.com/adrienverge/yamllint)の設定ファイルでは[key-ordering](https://yamllint.readthedocs.io/en/stable/rules.html#module-yamllint.rules.key_ordering)を無効にする必要があります。

一方、例えばCIツールの設定ファイル等で（`.circleci/config.yml`、`.github/workflows/build.yml`、etc）で[key-ordering](https://yamllint.readthedocs.io/en/stable/rules.html#module-yamllint.rules.key_ordering)を有効にして検証したい場合は別の[yamllint](https://github.com/adrienverge/yamllint)の設定ファイルを別に用意しそちらでは[key-ordering](https://yamllint.readthedocs.io/en/stable/rules.html#module-yamllint.rules.key_ordering)を有効にします。

Ansibleコンテンツに対して厳しめの設定で[yamllint](https://github.com/adrienverge/yamllint)を実行し[yamllint](https://github.com/adrienverge/yamllint)の指示通りにエラーを修正してもそのAnsibleコンテンツは動作しない可能性があると言う事です。言い換えればAnsibleコンテンツに対して[yamllint](https://github.com/adrienverge/yamllint)のすべてのルールを適用するのは悪手になります。

### .yamllintのignoreでファイルを制御する？

Ansible lintと[yamllint](https://github.com/adrienverge/yamllint)で同じ設定ファイルを利用しようと思えばできない事はないですが記述量が増えて現実的ではありません。

何が設定されているのか把握するのが困難になります。

```:.yamllint
---
yaml-files:
  - '*.yaml'
  - '*.yml'
  - '.yamllint'

rules:
  braces:
    level: error
    ignore: |
      defaults/main.yml
      meta/argument_specs.yml
      meta/main.yml
      molecule/default/molecule.yml
      tasks/main.yml
  brackets:
    level: error
  colons: enable
  commas: enable
  comments:
    level: error
  comments-indentation:
    level: error
  document-end: disable
  document-start:
    level: error
  empty-lines: enable
  empty-values: disable
  float-values: disable
  hyphens: enable
  indentation: enable
  key-duplicates:
    level: error
  key-ordering:
    level: error
    ignore: |
      defaults/main.yml
      meta/argument_specs.yml
      meta/main.yml
      molecule/default/molecule.yml
      tasks/main.yml
  line-length:
    level: error
    ignore: |
      defaults/main.yml
      meta/argument_specs.yml
      meta/main.yml
      molecule/default/molecule.yml
      tasks/main.yml
  new-line-at-end-of-file: enable
  new-lines: enable
  octal-values: disable
  quoted-strings: disable
  trailing-spaces: enable
  truthy:
    level: warning
```

### 参考サイト

* [yaml — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/yaml/)
* [yamllint documentation — yamllint 1.28.0 documentation](https://yamllint.readthedocs.io/en/stable/index.html)