Làm cách nào để kiểm tra phản hồi JSON từ yêu cầu uri với Ansible?


15

Tôi có một nhiệm vụ Ansible thực hiện yêu cầu URI đến trang web để nhận phản hồi JSON. Tôi muốn Ansible làm một cái gì đó nếu biến JSON lồng nhau được xác định và một cái gì đó khác nếu nó không.

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

Lưu ý rằng việc sử dụng ignore_errorschỉ hoạt động cho lệnh của tác vụ không thành công, không phải để kiểm tra các giá trị không xác định trong cấu trúc dữ liệu lồng nhau trong mẫu Jinja. Vì vậy, nếu json_response.json.nested1.nested2không được xác định, tác vụ này vẫn sẽ thất bại mặc dù ignore_errors=yesđã được đặt.

Làm cách nào để có được playbook này để lưu trữ một số giá trị mặc định /tmp/foo.txtnếu yêu cầu không thành công hoặc nếu yêu cầu không có giá trị lồng nhau được xác định?

Câu trả lời:


20

Bạn cần sử dụng bộ lọc jinja2 ( http://docs.ansible.com/ansible/playbooks_filters.html ). Trong trường hợp này, tên của bộ lọc là from_json . Trong ví dụ sau tôi sẽ thực hiện một hành động khi tìm thấy khóa và hành động khác khi không thể tìm thấy:

 ---                                                                                                            

 - 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    

Bây giờ thay thế gỡ lỗi cho phù hợp để thực hiện hành động mong muốn.

Hy vọng nó giúp,


3

Tôi đã vấp ngã ở đây sau khi tìm cách làm thế nào để trích xuất một trường từ json từ api github. Tôi đã kết thúc với giải pháp sau đây.

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

register: github_json

và sử dụng nó ở một nơi khác như thế này:

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

1
Tôi không chắc điều này thực sự giúp ích cho OP: bạn không thực sự giải thích khóa $ đến từ đâu và câu hỏi cơ bản là hỏi điều gì xảy ra khi không có $keytrường trong phản hồi - tức là defaultbộ lọc của jinja có thể hữu ích cho.
iwaseatenbyagrue

1
Đây không phải là câu trả lời trực tiếp cho OP vì câu hỏi đã hơn một năm rưỡi nhưng tôi hy vọng nó có thể hữu ích cho những người muốn nhận các giá trị JSON từ một API chỉ sử dụng Ansible, đó là cách tôi tình cờ gặp phải trang.
Samy Coenen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.