てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ansible-navigator 経由で ansible-lint するには基本的に EE 内に ansible-lint が必要

はじめに

ansible-navigator は、Playbook を実行するだけでなく ansible-lint を呼び出す機能もあります。

タイトル通り、多分 EE 側に ansible-lint が必要だろうと思っていたものの、一応確かめてみようと思ったので試しました(結果タイトル通りでした)。基本的に とつけたのは、EE(Exuecution Environment) を無効化した場合は、ホスト側に必要なためです。

一通り試した結果をまとめます。

  • 環境
    • ansible-navigator==3.0.2
    • ansible-navigator.yml なし
    • .ansible-lint.config/ansible-lint.yml なし

1. EE 有効で実行

まずは、EE 有効(デフォルト)のまま ansible-lint を実行するパターンです。

1.1 EE内に ansible-lint あり、ホストになし

今回の環境でデフォルトで利用する EE のイメージ ghcr.io/ansible/creator-ee:v0.14.1 の中には ansible-lint が入っています。なのでこのまま使います。

結果の一覧性を重視して、モードは --mode stdout を指定することにします。

% ansible-navigator lint --mode stdout
name[play]: All plays should be named. (warning)
hello.yml:2

fqcn[action-core]: Use FQCN for builtin module actions (debug).
hello.yml:11 Use `ansible.builtin.debug` or `ansible.legacy.debug` instead.

EE 内の ansible-lint が実行され、結果が表示されました。

なお、上記コマンド実行中に docker ps --no-trunc で確認したところ COMMAND 列に "entrypoint ansible-lint -qq --offline" と表示されました。

1.2. EE内に ansible-lint なし、ホストにもなし

ansible-lint が入っていないイメージとして quay.io/ansible/ansible-runner を利用します。イメージの指定は --eei または --execution-environment-image です。

% ansible-navigator lint --mode stdout --eei quay.io/ansible/ansible-runner:latest
...(略)...
[dumb-init] ansible-lint: No such file or directory

ansible-lint がないというエラーが発生しました。それはそう。

2. EE 無効で実行

今度は、デフォルトの EE 無効で ansible-lint を実行するパターンです。ansible-navigator コマンドに --ee false をつけると EE の利用を無効化できます。

2.1 ホストに ansible-lint あり

ホスト側に ansible-lint がある状態で実行します。

% pip list | grep ansible-lint  # ansible-lint の有無確認
ansible-lint        6.14.4      # ある
% ansible-navigator lint --mode stdout --ee false
name[play]: All plays should be named. (warning) # ignored
hello.yml:2

fqcn[action-core]: Use FQCN for builtin module actions (debug). (warning) # ignored
hello.yml:11 Use `ansible.builtin.debug` or `ansible.legacy.debug` instead.

ホスト側の ansible-lint が実行されました。

2.2 ホストに ansible-lint なし

ホストに ansible-lint がない状態で実行します。

% pip list | grep ansible-lint  # ansible-lint の有無確認(ない)
% ansible-navigator lint --mode stdout --ee false      
Warning: Issues were found while applying the settings.
   Hint: Command provided: 'lint --mode stdout --ee false'

  Error: ansible-lint command could not be found.
   Hint: Try 'pip install ansible-lint' or consider using an execution
         environment which provides ansible-lint.

   Note: Configuration failed, using default log file location. (/Users/sakana/an
         sible/ansible-navigator.log) Log level set to debug
   Hint: Review the hints and log file to see what went wrong.

ansible-lint がないエラーが発生しました。エラーメッセージがとてもていねいですね。

補足

EE の利用有無に関わらず、ansible-lint の設定ファイル(.ansible-lint.config/ansible-lint.yml)を利用する場合は、Playbook と同じくホスト側に配置します。

ヘルプを見ただけですが、ansible-navigator 側の --lic--lint-config というオプションで設定ファイルのパスの明示指定もできるようです。

% ansible-navigator lint --help
....(略)...
Options (lint subcommand):
 --lic  --lint-config                            Specify the path to the ansible-lint configuration
                                                 file
 lintables                                       Path to files on which to run ansible-lint

おわりに

ansible-navigator はさまざまな機能を呼び出せるようになっていて、EE を使うかどうかも指定できて万能感が出てきていますね。

ただ、例えば ansible-lint の -f のようなオプションを ansible-navigator lint でも指定したいときにどうすればいいのかはわかりませんでした。いつか調べてみたいと思います。