Ansible:访问json字段并将其用作变量

Ansible:访问json字段并将其用作变量,json,ansible,Json,Ansible,我必须发送一些PUT请求到服务器,URL:,并作为主体传递一些json文件item1.json、item2.json - name: invoke service uri: url: "https://XXXX.com/{{ item.id }}" method: PUT return_content: yes body_for

我必须发送一些PUT请求到服务器,URL:,并作为主体传递一些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 object”没有属性“id”。
那么,如何访问该字段呢?

问题在于以下几行:

url: "https://XXXX.com/{{ item.id }}"
item的值是with_items中定义的JSON文件名,而不是JSON文件的内容

最快的修复方法是以与身体相同的方式打开和解析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:directive而不是with_项

with_文件将自动打开并读取文件内容,因此无需再调用查找:

- 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