2016-05-25 12 views
5

मुझे पर्यावरण चर सेट करने के लिए एक उत्तरदायी प्लेबुक में एकल और डबल कोट्स से ठीक से बचने की आवश्यकता है। इस में से कोई भी काम करता है:एक ही स्ट्रिंग के भीतर YAML में डबल और सिंगल कोट्स से कैसे बचें

- name: Set environment variable 
    command: > 
     export EXTRA_CONFIG=“'”{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}“'” 

    - name: Set environment variable 
    command: > 
     export EXTRA_CONFIG=''{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}'' 

    - name: Set environment variable 
    command: > 
     export EXTRA_CONFIG=''{\"client\": {\"subscriptions\": [\"DIND-Worker\"], \"cluster\": \"internal\"}}'' 

इस देखा:

http://yaml.org/spec/current.html#id2532720

https://github.com/dotmaster/toYaml/issues/1

त्रुटि संदेश मैं मिलता है:

fatal: [ip.address]: FAILED! => {"changed": false, "cmd": "export 'EXTRA_CONFIG={\"client\":' '{\"subscriptions\":' '[\"DIND-Worker\"],' '\"cluster\":' '\"internal\"}}'", "failed": true, "msg": "[Errno 2] No such file or directory", "rc": 2} 
+0

क्या आप 'आदेश' मॉड्यूल के बजाय 'shell' का उपयोग करने का प्रयास कर सकते हैं? फिर आप आसानी से '\" 'से बच सकते हैं। अगर आपको केवल प्रति कार्य आधार पर env vars की आवश्यकता है तो आप 'shell' की 'पर्यावरण' सुविधा का उपयोग करने पर विचार कर सकते हैं जैसा कि यहां बताया गया है [http://stackoverflow.com/प्रश्न/31775099/कैसे-टू-सेट-पर्यावरणीय-चर-उपयोग-उत्तरदायी) – fishi

उत्तर

5

> एक ब्लॉक अदिश शुरू होता है, जिसमें आपको ई की आवश्यकता नहीं है कुछ भी स्कैप करें (और संक्रमित अनुक्रमों को संसाधित नहीं किया गया है)। तो आप अपने JSON की तरह मूल्य के आसपास एकल उद्धरण चाहते संभालने, बस कार्य करें:

- name: Set environment variable 
    command: > 
     export EXTRA_CONFIG='{"client": {"subscriptions": ["DIND-Worker"], "cluster": "internal"}}' 

संपादित करें: इसके अलावा पता है कि डिफ़ॉल्ट रूप से एक मुड़ा हुआ अदिश पीछे न्यू लाइन चरित्र भी शामिल हो सकता है। यदि आप यह नहीं चाहते हैं, तो के बजाय बस >- का उपयोग करें।

+0

क्या यह वास्तव में आपके लिए काम करता है? मेरे मामले में मुझे अभी भी '[Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं मिल जाएगी। 'निर्यात है 'कमांड' मॉड्यूल के माध्यम से संभव है? – fishi

+1

वैसे मैंने इसका जवाब YAML के बारे में अपने ज्ञान के आधार पर दिया; मुझे जवाब नहीं पता। लेकिन मुझे लगता है कि आदेश एक अलग खोल उदाहरण में निष्पादित किया गया है, इसलिए यहां कुछ भी निर्यात करने से प्रभावित नहीं होगा सिस्टम बिल्कुल। यदि आप वैश्विक पर्यावरण चर सेट करना चाहते हैं, तो आपको इसे '/ etc/environment' या कुछ में रखना होगा। – flyx

+0

अच्छा बिंदु - आप सही हैं, प्रत्येक कार्य एक नया खोल खोल देगा, जिसका अर्थ है env var पूरे खेल में लगातार नहीं है, सिवाय इसके कि आप इसे कुछ समर्पित फाइल में रखें नोड जिसे खोल द्वारा सोर्स किया जाता है या आप इसे प्रत्येक कार्य के लिए स्पष्ट रूप से सेट करते हैं, उदाहरण के लिए, उत्तरदायी 'खोल' मॉड्यूल की 'पर्यावरण' सुविधा का उपयोग करना। – fishi

2

आप जोड़ शैली scalars (> द्वारा शुरू की गई) का उपयोग कर रहे हैं और YAML 1.2 विनिर्देश के अनुसार आप पात्रों बच नहीं सकते:

मुड़ा scalars:

मुड़ा शैली से दर्शाया जाता है ">" सूचक। यह शाब्दिक शैली के समान है; हालांकि, तले हुए स्केलर लाइन फोल्डिंग के अधीन हैं।

और प्रासंगिक पाठ wral शाब्दिक शैली स्केलर्स में भागने से संबंधित है।

शाब्दिक स्केलर के अंदर, सभी (इंडेंट) वर्णों को सफेद अंतरिक्ष वर्णों सहित सामग्री माना जाता है। ध्यान दें कि सभी लाइन ब्रेक वर्ण सामान्यीकृत होते हैं। इसके अलावा, खाली रेखाएं तब्दील नहीं होती हैं, हालांकि अंतिम पंक्ति टूट जाती है और खाली रेखाओं का पीछा किया जाता है।

आपके उदाहरण से यह स्पष्ट नहीं है कि आप वास्तव में क्या करना चाहते हैं। आप शायद डबल उद्धृत शैली के पक्ष में तह शैली ड्रॉप चाहिए:

डबल-कोटेड शैली आसपास के "" द्वारा निर्दिष्ट किया जाता "। संकेतक यह केवल शैली मनमाने ढंग से तार व्यक्त का उपयोग करके करने में सक्षम है" \ "भागने अनुक्रम। यह "\" और "" वर्णों से बचने की लागत पर आता है।

या एकल उद्धृत शैली:

एकल उद्धृत शैली " '" संकेतक आसपास के द्वारा निर्दिष्ट किया जाता। इसलिए, एक एकल उद्धृत स्केलर के भीतर, ऐसे पात्रों को दोहराया जाना चाहिए। एकल-उद्धृत स्केलर में प्रदर्शन से बचने का यह एकमात्र रूप है। विशेष रूप से, "\" और "" "वर्णों का स्वतंत्र रूप से उपयोग किया जा सकता है। यह एकल-उद्धृत स्केलर को प्रिंट करने योग्य पात्रों को प्रतिबंधित करता है। इसके अतिरिक्त, एक लंबी सिंगल-उद्धृत रेखा तोड़ना संभव है जहां एक अंतरिक्ष चरित्र गैर- -spaces।

तो आपको सबसे पहले यह तय करना चाहिए कि आउटपुट वास्तव में क्या होना चाहिए, फिर यदि आपको बैकस्लैश वाले किसी भी अक्षर से बचने की आवश्यकता है। यदि आप नहीं करते हैं तो आप ' से बचकर " और \ से बचकर डबल उद्धृत शैली के बिना किसी भी भागने, या एकल उद्धृत शैली के बिना तह शैली का उपयोग कर सकते हैं। यदि आपको \ डबल कोटेड शैली से बचने की आवश्यकता है तो आपका एकमात्र विकल्प है।

+0

क्या आप अपना वाक्यांश स्पष्ट कर सकते हैं? 'यदि आपको डबल कोटेड शैली से बचने की आवश्यकता है तो आपका एकमात्र विकल्प है।' एकल उद्धरण के साथ, आपको '\ 'से बचने की आवश्यकता नहीं है। यदि आपको स्ट्रिंग में '\' शामिल करने की आवश्यकता है तो सिंगल कोट्स एक विकल्प क्यों नहीं हैं? –

+0

यदि आपको 'बच निकलने वाले वर्णों में से एक [http://www.yaml.org/spec/1.2/spec.html#id2776092) डालने की आवश्यकता है, तो आपको बैकस्लैश की आवश्यकता है। आप उन्हें एकल उद्धृत स्केलर तारों में नहीं डाल सकते हैं। उस संदर्भ में एकल उद्धरण के बारे में बात करना अप्रासंगिक है। – Anthon

+0

मैं देखता हूं। आपका मतलब है कि अगर किसी को \ n', 't t' जैसी चीजों को जोड़ने की ज़रूरत है, तो उसे डबल कोट्स का उपयोग करना होगा। सिंगल कोट्स बैकस्लैश में कोई विशेष अर्थ नहीं है।न तो बचने के अनुक्रम जैसे \ \ n', '\ t', और इसी तरह से। –

0

मुझे नहीं लगता कि इससे बचने के लिए कुछ भी करना है। docs for command से:

कमांड मॉड्यूल स्थान-सीमित तर्कों की एक सूची के बाद कमांड नाम लेता है। दिया गया आदेश सभी चयनित नोड्स पर निष्पादित किया जाएगा। इसे खोल के माध्यम से संसाधित नहीं किया जाएगा, इसलिए $HOME जैसे चर और "<", ">", "|", और "&" जैसे कार्य नहीं होंगे (shell मॉड्यूल का उपयोग करें यदि आपको इन सुविधाओं की आवश्यकता है)।

आप जिस आदेश को चलाने की कोशिश कर रहे हैं, export, निष्पादन योग्य नहीं है; यह एक खोल बनाया गया है। यह समझ में आता है कि अगर उत्तर एक शेल के माध्यम से कमांड नहीं चला रहा है कि शैल बिल्टिन उपलब्ध नहीं हैं, तो "ऐसी कोई फ़ाइल या निर्देशिका नहीं है।"

डॉक्स की तरह आप command के बजाय shell इस्तेमाल कर सकते हैं कहते हैं,, लेकिन मुझे यकीन है कि यह एक समाधान है, क्योंकि Ansible शायद ही खोल में बाद के आदेशों को चलाने के नहीं है नहीं कर रहा हूँ, इसलिए किसी भी वातावरण चर आपके द्वारा पहले सेट होगा अनुपस्थित रहो। कुछ प्रश्नों के लिए इस प्रश्न के उत्तर देखें जो काम करने की अधिक संभावना रखते हैं: How to set linux environment variables with ansible

संबंधित मुद्दे