2023年7月29日土曜日

Ansible Lintの最後に約2分の待ち時間が発生する問題

先日、Ansibleを6.0.0から8.1.0へバージョンアップした。その際に、Ansible Lintのバージョンも新しくなった(6.3.0 -> 6.17.2)。

バージョンアップしたところ、Ansible Lintの処理が想定以上に長期化してしまう問題が発生した。具体的には、Ansible Lintの処理完了後の最後のメッセージ表示がされるまでに、約2分の待ち時間が発生するようになってしまった。

$ ansible-lint

~(中略)~

WARNING  /usr/local/lib/python3.9/site-packages/jmespath/lexer.py:169 PendingDeprecationWarning deprecated string literal syntax
-- ★この間で2分ほど待機がある --
Passed: 0 failure(s), 0 warning(s) on 57 files. Last profile that met the validation criteria was 'production'.

本記事では、この事象を解決する方法を記載する。

環境

環境は以下の通り。

  • OS : AlmaLinux 8.5
  • Ansible : 8.1.0 [core 2.15.1]
  • Ansible Lint : 6.17.2

Ansible Lintのバージョンは以下コマンドで確認している。

$ ansible-lint --version
ansible-lint 6.17.2 using ansible-core:2.15.1 ansible-compat:4.1.2 ruamel-yaml:None ruamel-yaml-clib:None

解決方法

結論から言うと、以下の通り--offlineオプションを付与することで解決できる。

$ ansible-lint --offline

調査内容詳細

ここからは参考情報となるので、興味のある方のみ確認いただきたい。

今回の事象調査のため、ansible-lintコマンドに-vvオプションを付与したうえで詳細な実行結果を確認した。すると、Ansible Lintで時間を要するパターンにおいては以下のログが出力されており、インターネット接続のタイムアウト待ちの時間によって処理が長期化していることを確認した。

DEBUG    Unable to fetch latest version from https://api.github.com/repos/ansible/ansible-lint/releases/latest due to: <urlopen error [Errno 110] Connection timed out>

どうやら、GitHubに最新の情報取得を行おうと試みているようだ。そこで、ansible-lintコマンドのヘルプから--offlineオプションがあることを確認し、付与することで上記動作が発生しないようにした。

以下に、参考情報として--offlineオプションの有無における実行結果を記載する。

--offlineオプションなし

$ ansible-lint -vv

~(中略)~

Read documentation for instructions on how to ignore specific rule violations.

DEBUG    Determined rule-profile order: {'internal-error': (0, 'min'), 'load-failure': (1, 'min'), 'parser-error': (2, 'min'), 'syntax-check': (3, 'min'), 'command-instead-of-module': (4, 'basic'), 'command-instead-of-shell': (5, 'basic'), 'deprecated-bare-vars': (6, 'basic'), 'deprecated-local-action': (7, 'basic'), 'deprecated-module': (8, 'basic'), 'inline-env-var': (9, 'basic'), 'key-order': (10, 'basic'), 'literal-compare': (11, 'basic'), 'jinja': (12, 'basic'), 'no-free-form': (13, 'basic'), 'no-jinja-when': (14, 'basic'), 'no-tabs': (15, 'basic'), 'partial-become': (16, 'basic'), 'playbook-extension': (17, 'basic'), 'role-name': (18, 'basic'), 'schema': (19, 'basic'), 'name': (20, 'basic'), 'var-naming': (21, 'basic'), 'yaml': (22, 'basic'), 'name': (23, 'moderate'), 'name': (24, 'moderate'), 'name': (25, 'moderate'), 'spell-var-name': (26, 'moderate'), 'avoid-implicit': (27, 'safety'), 'latest': (28, 'safety'), 'package-latest': (29, 'safety'), 'risky-file-permissions': (30, 'safety'), 'risky-octal': (31, 'safety'), 'risky-shell-pipe': (32, 'safety'), 'galaxy': (33, 'shared'), 'ignore-errors': (34, 'shared'), 'layout': (35, 'shared'), 'meta-incorrect': (36, 'shared'), 'meta-no-tags': (37, 'shared'), 'meta-video-links': (38, 'shared'), 'meta-version': (39, 'shared'), 'meta-runtime': (40, 'shared'), 'no-changed-when': (41, 'shared'), 'no-changelog': (42, 'shared'), 'no-handler': (43, 'shared'), 'no-relative-paths': (44, 'shared'), 'max-block-depth': (45, 'shared'), 'max-tasks': (46, 'shared'), 'unsafe-loop': (47, 'shared'), 'avoid-dot-notation': (48, 'production'), 'sanity': (49, 'production'), 'fqcn': (50, 'production'), 'import-task-no-when': (51, 'production'), 'meta-no-dependencies': (52, 'production'), 'single-entry-point': (53, 'production'), 'use-loop': (54, 'production')}
                Rule Violation Summary
 count tag               profile rule associated tags
    12 yaml[empty-lines] basic   formatting, yaml
    23 yaml[indentation] basic   formatting, yaml

DEBUG    Unable to fetch latest version from https://api.github.com/repos/ansible/ansible-lint/releases/latest due to: <urlopen error [Errno 110] Connection timed out>
Failed: 35 failure(s), 0 warning(s) on 130 files. Last profile that met the validation criteria was 'min'.

--offlineオプションあり

$ ansible-lint --offline -vv

~(中略)~

Read documentation for instructions on how to ignore specific rule violations.

DEBUG    Determined rule-profile order: {'internal-error': (0, 'min'), 'load-failure': (1, 'min'), 'parser-error': (2, 'min'), 'syntax-check': (3, 'min'), 'command-instead-of-module': (4, 'basic'), 'command-instead-of-shell': (5, 'basic'), 'deprecated-bare-vars': (6, 'basic'), 'deprecated-local-action': (7, 'basic'), 'deprecated-module': (8, 'basic'), 'inline-env-var': (9, 'basic'), 'key-order': (10, 'basic'), 'literal-compare': (11, 'basic'), 'jinja': (12, 'basic'), 'no-free-form': (13, 'basic'), 'no-jinja-when': (14, 'basic'), 'no-tabs': (15, 'basic'), 'partial-become': (16, 'basic'), 'playbook-extension': (17, 'basic'), 'role-name': (18, 'basic'), 'schema': (19, 'basic'), 'name': (20, 'basic'), 'var-naming': (21, 'basic'), 'yaml': (22, 'basic'), 'name': (23, 'moderate'), 'name': (24, 'moderate'), 'name': (25, 'moderate'), 'spell-var-name': (26, 'moderate'), 'avoid-implicit': (27, 'safety'), 'latest': (28, 'safety'), 'package-latest': (29, 'safety'), 'risky-file-permissions': (30, 'safety'), 'risky-octal': (31, 'safety'), 'risky-shell-pipe': (32, 'safety'), 'galaxy': (33, 'shared'), 'ignore-errors': (34, 'shared'), 'layout': (35, 'shared'), 'meta-incorrect': (36, 'shared'), 'meta-no-tags': (37, 'shared'), 'meta-video-links': (38, 'shared'), 'meta-version': (39, 'shared'), 'meta-runtime': (40, 'shared'), 'no-changed-when': (41, 'shared'), 'no-changelog': (42, 'shared'), 'no-handler': (43, 'shared'), 'no-relative-paths': (44, 'shared'), 'max-block-depth': (45, 'shared'), 'max-tasks': (46, 'shared'), 'unsafe-loop': (47, 'shared'), 'avoid-dot-notation': (48, 'production'), 'sanity': (49, 'production'), 'fqcn': (50, 'production'), 'import-task-no-when': (51, 'production'), 'meta-no-dependencies': (52, 'production'), 'single-entry-point': (53, 'production'), 'use-loop': (54, 'production')}
                Rule Violation Summary
 count tag               profile rule associated tags
    12 yaml[empty-lines] basic   formatting, yaml
    23 yaml[indentation] basic   formatting, yaml

Failed: 35 failure(s), 0 warning(s) on 130 files. Last profile that met the validation criteria was 'min'.

以上。

0 件のコメント:

コメントを投稿

人気の投稿