てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] VS Code の Ansible 拡張経由で ansible-lint する際のチェック範囲

はじめに

VS Code には、Ansible Playbook を書く際に便利な拡張があります。

marketplace.visualstudio.com

とても便利な拡張で様々な機能があり、ファイル保存時に自動で 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なし)も同じバージョンを使用

ファイルやロールの構成

拡張経由で 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 を実行すると、実行中はステータバーに以下のような表示がされます。

ansible-lint 中

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

not_called_role 配下はチェックされず

この結果からも、読み込まれないロール 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 コマンドでファイル指定なし 低い。明示的な実行が必要(高めるには別途仕組みが必要) 高い。読み込まないロールもチェックされる

それぞれの特徴を活かして使い分け、組み合わせできればよいかなと思います。