You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible数组变量使用问题:动态组装POST请求Body失败

解决Ansible动态组装IVR请求Body的问题

正确的变量定义

你的第一个hosts_vars配置是正确的(数组结构可保存多个dests,不会出现键值覆盖),保留即可:

ivr:
  - id: 1
    name: "General"
    announcement: "General-ES"
    dests:
      - option: "t"
        id_dest: 10000
        type: "Queue"

      - option: "i"
        id_dest: 10000
        type: "Queue"

你后来尝试的定义中重复使用option等键,YAML会自动覆盖前面的键值对,仅保留最后一个,这是YAML的特性,请勿采用这种写法。

动态组装请求Body的Task配置

报错原因是item.dests是列表(数组),并非单个对象,直接访问.option属性会触发不存在的错误。你可以用Jinja2字典推导式直接把dests列表转换成API需要的键值对结构,同时避免手动拼接JSON字符串(易出错),直接用Ansible变量组装body:

- name: Creamos el ivr si no existe
  uri:
    url: "http://{{ ansible_host }}:{{ api_port }}/ivr/create"
    method: POST
    headers:
      Content-Type: "application/json"
      Authorization: "Bearer {{ result_post_token.json.token }}"
    return_content: yes
    body_format: json
    body:
      name: "{{ item.name }}"
      announcement: "{{ item.announcement }}"
      dests: "{{ {dest.option: {'type': dest.type, 'id': dest.id_dest} for dest in item.dests} }}"
    status_code: 201
    timeout: 30
  loop: "{{ ivr }}"

关键说明

  • {dest.option: {'type': dest.type, 'id': dest.id_dest} for dest in item.dests} 是Jinja2字典推导式,遍历item.dests中的每个对象,以option值为键,生成包含type和id(对应变量里的id_dest)的字典作为值。
  • 最终生成的dests结构完全符合API要求:
    {
      "t": {"type": "Queue", "id": 10000},
      "i": {"type": "Queue", "id": 10000}
    }
    
  • 启用body_format: json后,Ansible会自动将body中的变量转换为合法JSON字符串,无需手动处理引号转义问题。

这种写法可适配任意数量的dests,自动完成请求Body的动态组装。

内容的提问来源于stack exchange,提问作者Carlos Herrero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:55:13