こちらの記事はAnsible lint Advent Calendar 2022 15日目の記事になります。
今回はルールyamlについて説明します。
yaml
yamlはYAMLファイルの構文をチェックするものでyamllintを実行してファイルを検証します。
設定ファイルのパス
yamlはAnsible lintとyamllintの両方の設定ファイルで設定を行います。
yamllintの設定ファイルは
- カレントディレクトリの
.yamllint
、.yamllint.yaml
、.yamllint.yml
のいずれかのファイル - 環境変数
YAMLLINT_CONFIG_FILE
で定義されたパス ~/.config/yamllint/config
のいずれかになります。
ルールを適用するファイルと適用するルールの設定
yamlでルールを適用しないファイルを設定する場合はyamllintの設定ファイルへ記述します。例えばyaml[line-length]を無効にしたい場合は
---
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で特定のルールを有効にしたり無効にしたりする場合はyamllintの設定ファイルへ記述します。Ansible lintの設定ファイルへ記述する事もできますがyamllintの設定ファイルへ記述することで適用するルール
とルールを適用するファイル
の両方を細かく設定できます。
その他
CI等でyamllintとAnsible lintをそれぞれ別々に実行する
際はyamllintとAnsible lintで設定ファイルを分けた方が良い場合があります。
例えばyamllintのkey-orderingが有効になっていてこれがAnsibleコンテンツへ適用された場合、Ansibleではkeyの順番は変更できないパターンがありAnsibleコンテンツのkeyの順番を変更してしまうとAnsibleを実行した時にエラーになる可能性があります。そのためAnsibleコンテンツへ実行するyamllintの設定ファイルではkey-orderingを無効にする必要があります。
一方、例えばCIツールの設定ファイル等で(.circleci/config.yml
、.github/workflows/build.yml
、etc)でkey-orderingを有効にして検証したい場合は別のyamllintの設定ファイルを別に用意しそちらではkey-orderingを有効にします。
Ansibleコンテンツに対して厳しめの設定でyamllintを実行しyamllintの指示通りにエラーを修正してもそのAnsibleコンテンツは動作しない可能性があると言う事です。言い換えればAnsibleコンテンツに対してyamllintのすべてのルールを適用するのは悪手になります。
.yamllintのignoreでファイルを制御する?
Ansible lintと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