带有 cacert 选项的 Ansible URI 模块

And*_*w H 6 ssl curl ansible

我正在尝试做相当于:

curl -X POST --data <json> --key <path to key> --cert <path to cert> --cacert <path to cacert> --header "Content-Type: application/json" <url>

在 ansible 游戏中。根据http://docs.ansible.com/ansible/latest/uri_module.html的文档,有密钥、证书、X、标头和数据的等效项,但我还没有找到传递证书的方法权威档案。

我试过了:

environment:
  CURL_CA_BUNDLE: <path to cacert>
uri:
  url: <url>
  client_cert: <path to cert>
  client_key: <path to key>
  body: <json>
  method: POST
  body_format: json
Run Code Online (Sandbox Code Playgroud)

由于 mancurl 指定它将读取环境变量CURL_CA_BUNDLE。我也尝试过:

uri:
  url: <url>
  client_cert: <path to cert>
  client_key: <path to key>
  body: <json>
  method: POST
  body_format: json
  others: --cacert <path to cacert>
Run Code Online (Sandbox Code Playgroud)

这两种方法都没有奏效。如果没有 cacert,我会收到错误:“无法验证 的 SSL 证书<url>。请确保您的托管系统安装了有效的 CA 证书...”。我知道如果我传入validate_certs=False,那么该方法就会起作用,并且我知道它可以通过带有curl 的命令行起作用。

是否有其他选项可以传递到 URI 模块来绕过此问题?

zig*_*arn 5

uri模块不是 cURL,它是完整的 python 实现。因此 cURL 环境变量或选项不可能起作用。
others选项被记录为“文件模块接受的所有参数也在这里工作”,因此它仅意味着您可以使用ownergroupmode等将属性设置为dest.

client_certclient_key在最近的 2.4 中添加只是为了解决问题 #18141,他们没有考虑服务器 TLS 身份验证...

我可以看到 3 个解决方案:

  • 将您的 CA 证书添加到系统证书中(在任务的目标主机上uri) -仅对 python >= 2.7.9 有效
  • 使用该validate_certs: no选项禁用服务器证书验证(因此无需使用 CA 证书)
  • 提出问题(也许是 PR)以添加对选项的cacert支持

  • 请注意,您正在使用“validate_certs:no”切换到不安全模式。 (2认同)