Ansible モジュールによって送信された API リクエストをトラブルシューティングするにはどうすればよいですか?

Ansible モジュールによって送信された API リクエストをトラブルシューティングするにはどうすればよいですか?

背景は次のとおりです:
次のプレイブック (この StackOverflow トピックと使いやすさのために 1 つのタスクに簡略化されています) は、起動場所によって異なる結果になりました。 nutanix.ncp Galaxy コレクションを使用します (バージョン 1.9.0、1.8.0、1.7.0 などでテスト済み)

このntnx_subnets_infoメソッドは、prism central インスタンス上の既存のサブネットのリストをすべて取得するために呼び出され、name パラメータによってフィルタリングされて特定の VLAN の詳細のみが取得されます。

---
- name: test-get-subnet-info
  hosts: localhost

  vars:
    nutanix_host: "{{ XXXXXXX }}"
    nutanix_username: "{{ XXXXXXX }}"
    nutanix_password: "XXXXXXX "

  collections:
    - nutanix.ncp
  module_defaults:
    group/nutanix.ncp.ntnx:
      nutanix_host: "{{ XXXXXXX }}"
      nutanix_username: "{{ XXXXXXX }}"
      nutanix_password: "XXXXXXX "

  tasks:
  - name: Retrieve subnet info
    ntnx_subnets_info:
      filter:
        name: "my-VLAN"

Debian 11サーバーでは、このタスクは以下のようにスムーズに実行されます。ここに画像の説明を入力してください

一方、私のカスタムAWX EE(dockerとK8sの両方でテスト済み)では、あまり明確ではない次のエラーが発生しました。Failed to convert API response to json
ここに画像の説明を入力してください

トラブルシューティングの手順:

  • nutanix.ncp コレクションを 1.9.0 から 1.8.0 および 1.7.0 にダウングレードしてみてください => 結果は同じです (debian では動作しますが、docker からは動作しません)
  • Ansible バージョンを比較 => 両方の環境とも Ansible Core 2.15.4 で実行されています
  • Python バージョンを比較 => docker イメージ環境は 3.9.17、debian サーバーは 3.9.2
  • 両方の環境から手動で curl リクエストを起動する =>両方の環境ですべてが動作します
  • -vvvvvv オプションを使用してプレイブックを起動し、ログの相違点を比較します => nutanix.ncp はそれほどチャットではなく、以下のスクリーンショットに示すように、他のエラーは表示されません。

質問

  • Ansible API リクエストを「分析」する方法はありますか? Ansible 用の wireshark/fiddler のようなものですか?
  • この問題をさらにトラブルシューティングして修正するにはどうすればよいでしょうか? 片側では動作するのに対し、もう片側では動作しないので、いくつかを比較して違いを見つけられるでしょうか?

ありがとう

答え1

多くのテストと調査の後、nutanix.ncp コレクション ファイルで entity.py を見つけました。これは、「API 応答を json に変換できませんでした」というメッセージの原因となるファイルでした。

  • 1 つの関数は、URL 応答の受信コードが 300 より大きい場合にエラー メッセージを送信します。Wireshark キャプチャを実行して、ネットワーク フローにエラーがあることがわかりました。 ここに画像の説明を入力してください

  • 次に、Docker イメージ / K8s ポッドから Prism Central への接続を確認します。

    コマンドはopenssl s_client -connect fqdn_prism_central:9440エラーメッセージを表示します

「戻りコードを確認してください: 20 (ローカル発行者証明書を取得できません)」

  • 最後に、Docker イメージ上の証明書チェーンを (Dockerfile を通じて) 更新すると、AWX ではすべて正常になりました。

    私の場合、AWX EEイメージは公式のawx-ee(https://quay.io/repository/ansible/awx-ee?tab=tags&tag=latest)、dockerfile に次の手順を追加します (注: CentOS イメージ以外のものを使用している場合は、パスとコマンドが異なる場合があります)。

COPY ./certificate_chain.pem /etc/pki/ca-trust/source/anchors/certificate_chain.pem
RUN chmod 644 /etc/pki/ca-trust/source/anchors/certificate_chain.pem && update-ca-trust extract

かなり大変ですが、うまく機能します! :)

関連情報