如何使用Ansible从uri请求中检查JSON响应?

我有一个Ansible任务,向网站发出URI请求以获得JSON响应。 如果嵌套的JSONvariables是定义的,我希望Ansible做一些事情,如果不是的话,也要做其他事情。

- name: Get JSON from the Interwebs uri: url="http://whatever.com/jsonresponse" return_content=yes register: json_response - name: Write nested JSON variable to disk copy: content={{json_response.json.nested1.nested2}} dest="/tmp/foo.txt" 

请注意,使用ignore_errors仅适用于任务命令失败,不适用于检查Jinja模板中嵌套数据结构中的未定义值。 所以如果没有定义json_response.json.nested1.nested2 ,尽pipe设置了ignore_errors=yes ,这个任务仍然会失败。

如果请求失败,或者如果请求没有定义正确的嵌套值,如何获得此/tmp/foo.txt/tmp/foo.txt存储一些默认值?

您需要使用jinja2filter( http://docs.ansible.com/ansible/playbooks_filters.html )。 在这种情况下,filter的名称是from_json 。 在下面的示例中,我将在发现密钥时执行操作,找不到时执行其他操作:

  --- - hosts: somehost sudo: yes tasks: - name: Get JSON from the Interwebs uri: url="https://raw.githubusercontent.com/ljharb/node-json-file/master/package.json" return_content=yes register: json_response - debug: msg="Error - undefined tag" when: json_response["non_existent_tag"] is not defined - debug: msg="Success - tag defined =>{{ (json_response.content|from_json)['scripts']['test'] }}<=" when: (json_response.content|from_json)['scripts']['test'] is defined 

现在replace为适当的debugging采取所需的行动。

希望它有帮助,

我find了一个关于如何从github api中从json中提取字段的方法。 我结束了以下解决scheme。

 uri: url="https://api.github.com/repos/.../.../releases/latest" return_contents=yes register: github_json 

并在其他地方像这样使用它:

 "{{ github_json.json.$key }}"