ansible - 使用 ansible uri form-multipart inline
问题描述
我正在尝试使用 ansible 将 dns 更新发布到 fusionlayer infinity,使用 form-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
}
form-multipart 应该如何在这里实际使用?
解决方案
{
由于在 jinja2 上下文中使用时的领先,您已经被 ansible 的自动强制行为所困扰。您可以在"invocation"
日志记录中看到这种情况,它将您的add
字符串变成了add
字典——这是由于领先{
导致 ansible 认为您打算add
成为 adict
并且它“帮助”了您。奇怪的是,它似乎只与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 评估总是一个错误
推荐阅读
- android - 尽管 proguard 处于停用状态,但真实广告未在发布模式下显示。可能是什么问题?
- c# - 如何将单选按钮插入 SQL Server 数据库?单选按钮位于 C# 的组框中
- raku - Perl 6:maxpairs 警告未定义值的字符串化
- java - 为什么 doGet 不运行 processRequest?
- java - Spring Boot - 如何从多模块项目中的姊妹模块启动我的 Spring Boot 应用程序?
- c# - 文本框自动完成 C#
- c - 如何在 linux 内核模块中获取下一个 TCP 段?
- haskell - Haskell中递归数组的内存使用情况
- git - Intellij 无法记住我的 git 凭据
- c# - C#如何在2个.cs文件之间返回一个值