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

时间:2017-03-28 14:07:23

标签: json ansible

我必须将一些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'。 那么如何访问该字段呢?

1 个答案:

答案 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