はじめに
VS Code には、Ansible Playbook を書く際に便利な拡張があります。
とても便利な拡張で様々な機能があり、ファイル保存時に自動で ansible-lint を実行することもできます。
Playbook の保存時に、そのPlaybook を起点にして ansible-lint が実行されます。コマンドでファイル名を指定せずに ansible-lint を実行する場合とはチェックする範囲が異なるので、試しながら確認しました。
先にまとめます。
| 方法 | 即時性 | 網羅性 |
|---|---|---|
| 拡張経由 | 高い。ファイル保存時にチェックされる | 低い。保存したPlaybookを起点にした読み込んだロールのみ。ロール内のタスクや変数ファイル保存時にはチェックされない |
| ansible-lint コマンドでファイル指定なし | 低い。明示的な実行が必要(高めるには別途仕組みが必要) | 高い。読み込まないロールもチェックされる |
今回私が試した環境、Playbookだとこうなった、という記録でしかないため、場合によっては結果が異なる可能性があります。
試した前提
環境
- VS Code 拡張 Ansible v1.2.44
settings.json内の関連設定は"ansible.executionEnvironment.enabled": trueのみ
- ansible-lint 6.12.2
- 今回の環境で拡張から呼ばれる EE(
ghcr.io/ansible/creator-ee:v0.14.1)内も、ansible-lint単体(EEなし)も同じバージョンを使用
- 今回の環境で拡張から呼ばれる EE(
ファイルやロールの構成
拡張経由で ansible-lint する際の起点となる Playbook をワークスペースのトップに用意しました(playbook.yml)。
その Playbook から 読み込まれるロール(called_role)や読み込まれないロール(not_called_roke)も用意しました。読み込まれるロール called_*_role 内でも、読み込まれないファイルとして not_called_tasks.yml や、not_called_vars.yml も用意しました。
また、ロールのディレクトリは関係ないディレクトリ other とその中に、読み込まれない Playbook と変数ファイルを用意しました。
まとめると以下のとおりです。(リポジトリはこちら akira6592/ansible-lint-content)
. ├── other # ロールではないディレクトリ │ ├── not_called_playbook.yml # 読み込まれない Playbook │ └── not_called_vars.yml # 読み込まれない変数ファイル ├── playbook.yml # 拡張経由でansible-lintする起点のPlaybook └── roles ├── called_import_role # import_role で読み込むロール │ ├── tasks │ │ ├── main.yml │ │ └── not_called_tasks.yml # 読み込まれないタスクファイル │ └── vars │ ├── main.yml │ └── not_called_vars.yml # 読み込まれない変数ファイル ├── called_include_role # include_role で読み込むロール │ ├── tasks │ │ ├── main.yml │ │ └── not_called_tasks.yml # 読み込まれないタスクファイル │ └── vars │ ├── main.yml │ └── not_called_vars.yml # 読み込まれない変数ファイル └── not_called_role # 読み込まれないロール ├── tasks │ └── main.yml └── vars └── main.yml
問題の仕込み
ansible-lint によってチェックされたかどうかを識別するために、各ファイルには少しずつ意図的に問題を 1つ仕込みました。
Playbook やロールのtasks 配下のファイルには、タスクに name がないという問題を仕込みました。
- ansible.builtin.debug: msg: Hello!
変数ファイルには、bool値が true/false ではないという問題を 1つ仕込みました。
enabled: yes
Ansible 拡張経由の ansible-lint のチェックの場合
ワークスーペーストップの playbook.yml を保存して、拡張経由で ansible-lint を実行したときの結果です。
playbook.ymlを起点にして、playbook.yml自体と読み込んでいるロールもチェックするansible.builtin.include_roleでもansible.builtin.import_roleでも- ただし、いずれも読み込むロール名はベタ書きの場合のみ
- ロールが読み込まれれば、ロール内の実際は読み込まれないタスクファイル、変数ファイルもチェックされる
- 読み込まれないロールはチェックされない
- モジュール名誤り(--syntax-check のエラーレベル)は検出されず、他の lint 結果が表示されない(不具合?仕様?)
- 内部的には
ansible-lint --offline --nocolor -f codeclimate /略/playbook.ymlを実行していた
拡張経由で ansible-lint を実行すると、実行中はステータバーに以下のような表示がされます。

チェックが完了すると、問題があるファイルがエクスプローラー上で赤く表示されます。今回の場合は以下のとおりでした。

この結果からも、読み込まれないロール not_called_role はチェックされないことが分かります。
ansiblie-lint コマンド経由でファイル名の指定なしのチェックの場合
比較のために、(拡張経由ではなく)ansible-lint コマンドで、ファイル名指定なしで実行するときのチェック範囲も書くにします。
- 読み込んでいないロールや、そもそもロールの検索パス上にないディレクトリ(今回は
other)配下の Playbook、変数ファイルもチェックされる playbook.ymlにモジュール名誤り(--syntax-check のエラーレベル)があると、それのみがレポートされ、他のチェック結果はレポートされない
% ansible-lint
WARNING Listing 12 violation(s) that are fatal
name[missing]: All tasks should be named.
other/not_called_playbook.yml:8 Task/Handler: debug msg=aaaa
yaml[truthy]: Truthy value should be one of [false, true]
other/not_called_vars.yml:2
name[missing]: All tasks should be named.
roles/called_import_role/tasks/main.yml:2 Task/Handler: debug msg=Hello!
name[missing]: All tasks should be named.
roles/called_import_role/tasks/not_called_tasks.yml:2 Task/Handler: debug msg=Hello!
yaml[truthy]: Truthy value should be one of [false, true]
roles/called_import_role/vars/main.yml:2
yaml[truthy]: Truthy value should be one of [false, true]
roles/called_import_role/vars/not_called_vars.yml:2
name[missing]: All tasks should be named.
roles/called_include_role/tasks/main.yml:2 Task/Handler: debug msg=Hello!
name[missing]: All tasks should be named.
roles/called_include_role/tasks/not_called_tasks.yml:2 Task/Handler: debug msg=Hello!
yaml[truthy]: Truthy value should be one of [false, true]
roles/called_include_role/vars/main.yml:2
yaml[truthy]: Truthy value should be one of [false, true]
roles/called_include_role/vars/not_called_vars.yml:2
name[missing]: All tasks should be named.
roles/not_called_role/tasks/main.yml:2 Task/Handler: debug msg=Hello!
yaml[truthy]: Truthy value should be one of [false, true]
roles/not_called_role/vars/main.yml:2
You can skip specific rules or tags by adding them to your configuration file:
# .config/ansible-lint.yml
warn_list: # or 'skip_list' to silence them completely
- name[missing] # Rule for checking task and play names.
- yaml[truthy] # Violations reported by yamllint.
Rule Violation Summary
count tag profile rule associated tags
6 name[missing] basic idiom
6 yaml[truthy] basic formatting, yaml
Failed after min profile: 12 failure(s), 0 warning(s) on 17 files.
A new release of ansible-lint is available: 6.12.2 → 6.14.6 Upgrade by running: pip install --upgrade ansible-lint
まとめ
はじめに、に掲載したまとめの表を再掲します。
| 方法 | 即時性 | 網羅性 |
|---|---|---|
| 拡張経由 | 高い。ファイル保存時にチェックされる | 低い。保存したPlaybookを起点にした読み込んだロールのみ。ロール内のタスクや変数ファイル保存時にはチェックされない |
| ansible-lint コマンドでファイル指定なし | 低い。明示的な実行が必要(高めるには別途仕組みが必要) | 高い。読み込まないロールもチェックされる |
それぞれの特徴を活かして使い分け、組み合わせできればよいかなと思います。