如何排查Ansible nutanix.ncp模块API请求JSON转换失败故障?
Ansible Nutanix模块跨环境执行异常排查
背景信息
以下简化后的Ansible Playbook(仅保留单个任务)在不同环境运行结果不一致,该Playbook使用nutanix.ncp Galaxy集合(已测试1.9.0、1.8.0、1.7.0等版本),通过ntnx_subnets_info模块从Prism Central实例获取指定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参数运行Playbook并对比日志,nutanix.ncp日志信息有限,未获取有效错误详情
问题与解答
1. 是否存在类似Wireshark/Fiddler的工具,可用于分析Ansible发送的API请求?
- tcpdump抓包:在AWX EE容器内部执行抓包命令,捕获与Prism Central的交互流量,导出后用Wireshark本地分析。示例命令:
sudo tcpdump -i any host <Prism_Central_IP> -w ansible_nutanix_api.pcap - Python层调试:临时修改nutanix.ncp模块的代码(如
ntnx_subnets_info.py),在API请求和响应的关键位置添加打印语句,输出原始请求头、请求体、响应内容,直接对比差异。 - Ansible环境变量调试:设置
ANSIBLE_DEBUG=True环境变量运行Playbook,部分模块会输出更详细的执行日志(注意nutanix模块可能支持有限)。
2. 如何进一步排查并修复该问题?因仅环境不同导致结果差异,可通过对比哪些内容定位差异点?
重点对比以下环境差异点:
- 依赖库版本:两个环境中nutanix.ncp依赖的Python库(如
requests、urllib3、pyjwt等)版本可能不一致。分别执行pip list | grep -E "requests|urllib3|pyjwt|nutanix"输出并对比。 - SSL证书信任:AWX EE容器可能未信任Prism Central的SSL证书,导致请求返回证书错误页面(而非预期JSON)。可临时在模块中添加
validate_certs: no测试,或把Prism Central证书导入容器的系统信任存储。 - 代理配置:检查两个环境的
HTTP_PROXY、HTTPS_PROXY、NO_PROXY环境变量,容器内的代理设置可能导致请求被拦截或返回非JSON内容。 - 字符编码:对比Python默认编码,执行
python -c "import sys; print(sys.getdefaultencoding())",编码差异可能导致响应解析失败。 - 网络环境:检查容器的网络模式(如bridge/host)、防火墙规则、DNS解析,确保与Debian环境的网络通路完全一致。
- 请求细节差异:对比Ansible模块发送的请求与手动curl的请求细节(如请求头、认证方式、参数格式),通过模块调试打印请求信息,确认是否存在参数编码、头信息缺失等问题。
内容的提问来源于stack exchange,提问作者motorbass
相关产品推荐
相关产品推荐

