![如何排查 Ansible 模块发送的 API 请求问题?](https://linux22.com/image/789226/%E5%A6%82%E4%BD%95%E6%8E%92%E6%9F%A5%20Ansible%20%E6%A8%A1%E5%9D%97%E5%8F%91%E9%80%81%E7%9A%84%20API%20%E8%AF%B7%E6%B1%82%E9%97%AE%E9%A2%98%EF%BC%9F.png)
以下是背景信息:
以下剧本(简化为一个任务,以方便此 stackoverflow 主题和使用)根据我启动它的位置而得到不同的结果。它使用 nutanix.ncp galaxy 集合(使用版本 1.9.0、1.8.0、1.7.0... 进行测试)
调用该ntnx_subnets_info
方法来检索棱镜中央实例上所有现有子网的列表,并通过名称参数进行过滤以仅检索特定 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 选项启动剧本并比较日志中的差异 => nutanix.ncp 不是那么健谈,我没有收到任何其他错误,正如您在屏幕截图上看到的那样。
问题
- 有没有办法“分析” Ansible API 请求? 比如 Ansible 的 wireshark/fiddler?
- 我该如何进一步排除故障并修复此问题?由于它在一侧有效但在另一侧无效,我可能会比较一些东西并希望找到区别?
谢谢
答案1
经过多次测试和调查,在 nutanix.ncp 集合文件中找到了 entity.py。它是导致消息“无法将 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
相当坚韧,但效果很好!:)