這是上下文:
下面的劇本(為了方便使用,簡化為這個 stackoverflow 主題的一項任務)得到了不同的結果,這取決於我在哪裡啟動它。它使用 nutanix.ncp Galaxy 集合(使用版本 1.9.0、1.8.0、1.7.0...進行測試)
呼叫此ntnx_subnets_info
方法來檢索 prism 中心實例上現有子網路的所有列表,並透過 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"
而在我的自訂 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 選項啟動 playbook 並比較日誌上的差異 => nutanix.ncp 不是那麼健談,我沒有收到任何其他錯誤,正如您在後面的螢幕截圖中看到的那樣。
問題
- 有沒有辦法「分析」Ansible API 請求?就像 Ansible 的wireshark/fiddler 一樣?
- 我怎樣才能進一步排除並解決這個問題?因為它在一側有效,但在其他方面無效,我可能會比較一些東西並希望找到差異?
謝謝
答案1
經過多次測試和調查,剛剛在nutanix.ncp集合檔案中找到了entity.py。這是負責 msg「無法將 API 回應轉換為 json」的文件
當 URL 回應收到的代碼大於 300 時,一個函數會傳送錯誤訊息。我進入了wireshark捕獲並發現網路流中存在錯誤:
然後,它讓我檢查從我的 docker 映像/K8s pod 到我的 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
相當艱難,但效果很好! :)