Ansible을 사용하여 URI 요청에서 JSON 응답을 확인하는 방법은 무엇입니까?


15

JSON 응답을 얻기 위해 웹 사이트에 URI 요청을하는 Ansible 작업이 있습니다. 중첩 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만하는 것이 아닌 신사 템플릿 내에서 중첩 된 데이터 구조에서 정의되지 않은 값을 확인하기 위해, 실패한 작업의 명령이 작동합니다. 그래서 만약 json_response.json.nested1.nested2정의되지 않은이 작업은 여전히에도 불구하고 실패합니다 ignore_errors=yes세트되고.

/tmp/foo.txt요청이 실패하거나 요청에 올바른 중첩 값이 정의되지 않은 경우이 플레이 북에 기본값을 저장하려면 어떻게해야 합니까?

답변:


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

1
질문이 1 년 반 이상 되었기 때문에 OP에 대한 직접적인 응답은 아니지만 Ansible 만 사용하여 API에서 JSON 값을 얻으려는 사람들에게 도움이되기를 바랍니다. 페이지.
Samy Coenen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.