जिंस रिस्पॉन्स को Ansible के साथ एक uri अनुरोध से कैसे जांचें?


15

मेरे पास एक Ansible कार्य है जो JSON प्रतिक्रिया प्राप्त करने के लिए एक वेबसाइट पर एक URI अनुरोध करता है। मैं चाहता हूं कि अगर कोई नस्टेड 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केवल टास्क की कमांड फेल होने के लिए काम करता है, न कि जिन्जा टेम्प्लेट के भीतर नेस्टेड डेटा स्ट्रक्चर्स में अपरिभाषित मानों की जांच के लिए। इसलिए यदि 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

मैं जिठूब आपी से एक क्षेत्र को कैसे निकालने के लिए रास्ता खोजने के बाद यहां ठोकर खाई। मैं निम्नलिखित समाधान के साथ समाप्त हुआ।

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

register: github_json

और इसे इस तरह कहीं और उपयोग करें:

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

1
मुझे यकीन नहीं है कि यह वास्तव में ओपी की मदद करता है: आप वास्तव में यह नहीं समझाते हैं कि $ कुंजी कहां से आती है, और सवाल मूल रूप से पूछ रहा है कि क्या होता है जब $keyप्रतिक्रिया में कोई क्षेत्र नहीं होता है - अर्थात कुछ जिंजा के defaultफ़िल्टर के लिए उपयोगी हो सकता है।
इवासेतेनबाग्रे

1
यह ओपी के लिए एक सीधी प्रतिक्रिया नहीं थी क्योंकि सवाल एक वर्ष और आधे से अधिक पुराना है, लेकिन मैं उम्मीद कर रहा था कि यह उन लोगों के लिए मददगार हो सकता है जो JSON मानों को केवल एक API का उपयोग करके प्राप्त करना चाहते थे जो कि मैंने इस पर कैसे ठोकर खाई है पृष्ठ।
सामी कोएनन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.