首页 > 解决方案 > 使用 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 应该如何在这里实际使用?

标签: ansible

解决方案


{由于在 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 评估总是一个错误


推荐阅读