我必须将一些PUT请求发送到服务器,URL:https://XXXX.com/id,并将一些json文件(item1.json,item2.json ...)传递给主体。
- name: invoke service
uri:
url: "https://XXXX.com/{{ item.id }}"
method: PUT
return_content: yes
body_format: json
headers:
Content-Type: "application/json"
X-Auth-Token: "XXXXXX"
body: "{{ lookup('file', item) }}"
with_items:
- item1.json
- item2.json
- item3.json
url的id参数位于相应的json文件中。 json文件的结构如下:
{
"address": "163.111.111.111",
"id": "ajsaljlsaaj",
"server": "dnnwqkwnlqkwnldkwqldn"
}
我写的代码似乎不起作用,我得到'ansible.vars.unsafe_proxy.AnsibleUnsafeText对象'没有属性'id'。 那么如何访问该字段呢?
答案 0 :(得分:1)
问题在于以下一行:
url: "https://XXXX.com/{{ item.id }}"
item
的值是with_items
中定义的JSON 文件名,而不是JSON文件的内容。
最快修复是以与body:
声明中相同的方式打开和解析JSON文件:
- name: invoke service
uri:
url: "https://XXXX.com/{{ ( lookup('file', item)|from_json ).id }}"
method: PUT
return_content: yes
body_format: json
headers:
Content-Type: "application/json"
X-Auth-Token: "XXXXXX"
body: "{{ lookup('file', item) }}"
with_items:
- item1.json
- item2.json
- item3.json
一个更好解决方案是使用with_file:
指令而不是with_items
。
with_file
会自动打开并阅读文件内容,因此无需再调用lookup
:
- name: Provision the Docker Swarm managers
hosts: localhost
tags: provision
gather_facts: False
become: True
tasks:
- name: invoke service
uri:
url: "https://XXXX.com/{{ (item|from_json).id }}"
method: PUT
return_content: yes
body_format: json
headers:
Content-Type: "application/json"
X-Auth-Token: "XXXXXX"
body: "{{ item }}"
with_file:
- item1.json
- item2.json
- item3.json