วิธีการตรวจสอบการตอบสนอง JSON จากคำขอ uri กับ Ansible?


15

ฉันมีงาน Ansible ที่ทำให้คำขอ URI ไปยังเว็บไซต์เพื่อรับการตอบกลับ JSON ฉันต้องการให้ Ansible ทำบางสิ่งหากตัวแปร JSON ที่ซ้อนกันถูกกำหนดและอย่างอื่นถ้าไม่ใช่

- 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ถูกตั้งค่าไว้

ฉันจะให้ playbook นี้เก็บค่าเริ่มต้นได้/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    

ตอนนี้แทนที่ debug สำหรับที่เหมาะสมเพื่อดำเนินการที่ต้องการ

หวังว่ามันจะช่วย


3

ฉันสะดุดที่นี่หลังจากหาวิธีในการแยกเขตข้อมูลจาก json จาก github api ฉันลงเอยด้วยวิธีแก้ปัญหาต่อไปนี้

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

register: github_json

และใช้งานที่อื่นเช่นนี้:

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

1
ฉันไม่แน่ใจว่าสิ่งนี้ช่วย OP ได้จริง ๆ : คุณไม่ได้อธิบายว่า $ key มาจากไหนและคำถามนั้นถามว่าเกิดอะไรขึ้นเมื่อไม่มี$keyการตอบคำถาม - เช่นบางสิ่งบางอย่างที่defaultตัวกรองของ jinja อาจมีประโยชน์
iwaseatenbyagrue

1
นี่ไม่ใช่การตอบกลับโดยตรงไปยัง OP เนื่องจากคำถามมีอายุมากกว่าครึ่งปี แต่ฉันหวังว่ามันจะมีประโยชน์สำหรับผู้ที่ต้องการรับค่า JSON จาก API โดยใช้เพียง Ansible ซึ่งเป็นวิธีที่ฉันสะดุด หน้า.
Samy Coenen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.