Como verificar a resposta JSON de uma solicitação uri com Ansible?

13

Eu tenho uma tarefa Ansible que faz uma solicitação de URI para um site para obter uma resposta JSON. Eu quero Ansible para fazer algo se a variável JSON aninhada é definida, e outra coisa, se não for.

- 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"

Observe que usar ignore_errors só funciona para o comando da tarefa com falha, não para verificar valores indefinidos em estruturas de dados aninhadas em um modelo Jinja. Portanto, se json_response.json.nested1.nested2 não estiver definido, essa tarefa ainda falhará, apesar de ignore_errors=yes estar definido.

Como obtenho este manual para armazenar algum valor padrão em /tmp/foo.txt se a solicitação falhar ou se a solicitação não tiver o valor aninhado correto definido?

    
por Neil 16.09.2015 / 23:16

2 respostas

18

Você precisa usar um filtro jinja2 ( link ). Nesse caso, o nome do filtro é from_json . No exemplo a seguir, realizarei uma ação quando a chave for encontrada e outra ação quando não for possível encontrá-la:

 ---                                                                                                            

 - 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    

Agora substitua a depuração pelo apropriado para executar a ação desejada.

Espero que ajude,

    
por 17.09.2015 / 02:17
3

Eu tropecei aqui depois de procurar uma maneira de extrair um campo do json da API do github. Acabei com a seguinte solução.

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

register: github_json

e use-o em outro lugar como este:

"{{ github_json.json.$key }}"
    
por 23.03.2017 / 20:18

Tags