使用ansible uri表单多部分内联



我正试图使用ansible将dns更新发布到fusionlayer infinity,这应该可以通过使用表单multipart-body_format来实现,但我似乎无法实现。

我本质上是在尝试复制这个curl调用的功能:

curl -k -X PUT -u "$1:$2" $3 --form $4'="{"name": "'$5'", "type": "'$6'", "value": "'$7'"}"'

我现在正在尝试:

- name: Add records
ansible.builtin.uri:
url: "{{ infinity.url_base }}/zones/{{ infinity.zone_id }}"
user: "{{ user_infinity.user }}"
password: "{{ user_infinity.pass }}"
method: PUT
body_format: form-multipart
body:
add: '{"name": "{{ item }}", "type": "A", "value": "{{ app_hosts[item] }}"}'
with_items: "{{ app_hosts }}"

这给了我错误

"msg": "failed to parse body as form-multipart: at least one of filename or content must be provided"

即使调用在我看来刚刚好。

"invocation": {
"module_args": {
"attributes": null,
"body": {
"add": {
"name": "recordname",
"type": "A",
"value": "10.5.13.15"
}
},
"body_format": "form-multipart",
"ca_path": null,
"client_cert": null,
"client_key": null,
"creates": null,
"dest": null,
"follow_redirects": "safe",
"force": false,
"force_basic_auth": false,
"group": null,
"headers": {},
"http_agent": "ansible-httpget",
"method": "PUT",
"mode": null,
"owner": null,
"password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"remote_src": false,
"removes": null,
"return_content": false,
"selevel": null,
"serole": null,
"setype": null,
"seuser": null,
"src": null,
"status_code": [
200
],
"timeout": 30,
"unix_socket": null,
"unsafe_writes": false,
"url": "https://ipam/rest/v1/zones/56451",
"url_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"url_username": "username",
"use_gssapi": false,
"use_proxy": true,
"user": "username",
"validate_certs": true
}

这里应该如何实际使用multipart形式?

由于在jinja2上下文中使用前导{,您已经被ansible的自动强制行为所困扰。你可以在"invocation"日志中看到这种情况,它将你的add字符串变成了add字典——这是由于前导{导致ansible认为你的意思是adddict;帮助";你奇怪的是,它似乎只发生在with_items:部分的组合中,因为如果没有循环,我就无法再现这种行为

它似乎明确了jinja2评估的使用,然后明确了|string过滤器使它对我有效

ansible.builtin.uri:
... as before ...
body_format: form-multipart
body:
add: '{{ {"name": item, "type": "A", "value": app_hosts[item]} | to_json | string }}'

您还将注意到"name": "{{ item }}"已更改为"name": item;这是因为使用嵌套的jinja2评估总是一个错误