我有一个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 }}"