如何排查 Ansible 模块发送的 API 请求问题?

如何排查 Ansible 模块发送的 API 请求问题?

以下是背景信息:
以下剧本(简化为一个任务,以方便此 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"

在 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”的文件

  • 当 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

相当坚韧,但效果很好!:)

相关内容