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
相关产品推荐
相关产品推荐

