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


15

我有一个Ansible任务,该任务向网站发出URI请求以获取JSON响应。如果嵌套的JSON变量已定义,我希望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未定义,则尽管ignore_errors=yes已设置此任务仍将失败。

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

Answers:


20

您需要使用jinja2过滤器(http://docs.ansible.com/ansible/playbooks_filters.html)。在这种情况下,过滤器的名称为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    

现在,将调试替换为适当的位置,以采取所需的操作。

希望能帮助到你,


3

寻找有关如何从github API的json提取字段的方法后,我在这里迷迷糊糊。我得到了以下解决方案。

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

register: github_json

并在其他地方使用它:

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

1
我不确定这是否会真正帮助OP:您并没有真正解释$ key的来源,而问题基本上是询问$key响应中没有字段时会发生什么,即jinja的default过滤器可能有用。
iwaseatenbyagrue '17

1
这不是对OP的直接回应,因为问题已经存在一年半了,但我希望它对希望仅使用Ansible从API获取JSON值的人们有所帮助,这是我偶然发现的方式页。
Samy Coenen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.