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

15

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

- 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_errorsapenas funciona para o comando da tarefa falhar, não para verificar valores indefinidos em estruturas de dados aninhadas em um modelo Jinja. Portanto, se json_response.json.nested1.nested2não estiver definido, essa tarefa ainda falhará, apesar de ignore_errors=yester sido definida.

Como faço para que este manual armazene algum valor padrão /tmp/foo.txtse a solicitação falhar ou se a solicitação não tiver o valor aninhado certo definido?

Neil
fonte

Respostas:

20

Você precisa usar um filtro jinja2 ( http://docs.ansible.com/ansible/playbooks_filters.html ). Nesse caso, o nome do filtro é from_json . No exemplo a seguir, executarei uma ação quando a chave for encontrada e outra ação quando a não puder ser encontrada:

 ---                                                                                                            

 - 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 o debug pelo apropriado para executar a ação desejada.

Espero que ajude,

alfredocambera
fonte
3

Eu tropecei aqui depois de procurar uma maneira de extrair um campo de 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 }}"
Samy Coenen
fonte
1
Não tenho certeza se isso realmente ajuda o OP: você realmente não explica de onde vem a chave $, e a pergunta é basicamente perguntar o que acontece quando não há $keycampo na resposta - ou seja, algo para o qual o defaultfiltro de jinja possa ser útil.
precisa saber é o seguinte
1
Essa não foi uma resposta direta ao OP, já que a pergunta tem mais de um ano e meio, mas eu esperava que pudesse ser útil para pessoas que desejassem obter valores JSON de uma API usando apenas o Ansible. página.
Samy Coenen