Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स

यदि आप विकास और उत्पादन में वेब ऐप्स को प्रभावी ढंग से प्रबंधित करने में सक्षम होना चाहते हैं, तो आपको पर्यावरण चर को समझना होगा।

यह हमेशा मामला नहीं था। कुछ साल पहले, शायद ही कोई अपने रेल ऐप्स को पर्यावरण चर के साथ कॉन्फ़िगर कर रहा था। लेकिन फिर हेरोकू हुआ।

हरोकू ने डेवलपर्स को 12-कारक ऐप दृष्टिकोण से परिचित कराया। अपने 12-कारक ऐप घोषणापत्र में वे ऐसे ऐप बनाने के लिए अपनी बहुत सी सर्वोत्तम प्रथाओं को निर्धारित करते हैं जिन्हें लागू करना आसान है। पर्यावरण चर पर अनुभाग विशेष रूप से प्रभावशाली रहा है।

बारह-कारक ऐप कॉन्फ़िगरेशन को पर्यावरण चर में संग्रहीत करता है (अक्सर env vars या env को छोटा किया जाता है)। Env var किसी भी कोड को बदले बिना डिप्लॉयमेंट के बीच बदलना आसान है; कॉन्फिग फाइलों के विपरीत, गलती से कोड रेपो में उनके चेक किए जाने की संभावना बहुत कम होती है; और कस्टम कॉन्फिग फाइलों, या जावा सिस्टम प्रॉपर्टीज जैसे अन्य कॉन्फिग मैकेनिज्म के विपरीत, वे एक भाषा- और ओएस-अज्ञेयवादी मानक हैं।

पहले से कहीं अधिक रूबीवादी पर्यावरण चर का उपयोग कर रहे हैं। लेकिन अक्सर यह कार्गो-कल्चर तरीके से होता है। हम इन चीजों का उपयोग वास्तव में यह समझे बिना कर रहे हैं कि वे कैसे काम करती हैं।

यह पोस्ट आपको दिखाएगा कि पर्यावरण चर वास्तव में कैसे काम करते हैं - और शायद इससे भी महत्वपूर्ण बात यह है कि वे कैसे काम नहीं करते हैं। हम आपके Rails ऐप्स में पर्यावरण चरों को प्रबंधित करने के कुछ सबसे सामान्य तरीकों का भी पता लगाएंगे। आइए शुरू करें!

नोट:आप यहां पर्यावरण चर सुरक्षित करने के बारे में पढ़ सकते हैं।

हर प्रक्रिया का अपना पर्यावरण चर का सेट होता है

आपके सर्वर पर चलने वाले प्रत्येक प्रोग्राम में कम से कम एक प्रक्रिया होती है। उस प्रक्रिया को पर्यावरण चर का अपना सेट मिलता है। एक बार यह उनके पास हो जाने के बाद, उस प्रक्रिया के बाहर कुछ भी उन्हें बदल नहीं सकता है।

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

आपके द्वारा अपने सर्वर पर चलाए जाने वाले प्रत्येक प्रोग्राम को आपके द्वारा लॉन्च किए जाने पर पर्यावरण चर का अपना सेट मिल जाता है।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स हर प्रक्रिया का अपना परिवेश होता है।

पर्यावरण चर अपनी प्रक्रिया के साथ मर जाते हैं

क्या आपने कभी एक पर्यावरण चर सेट किया है, रिबूट किया है और पाया है कि यह चला गया था? चूंकि पर्यावरण चर प्रक्रियाओं से संबंधित हैं, इसका मतलब है कि जब भी प्रक्रिया समाप्त होती है, तो आपका पर्यावरण चर चला जाता है।

आप इसे एक आईआरबी सत्र में एक पर्यावरण चर सेट करके, इसे बंद करके और दूसरे आईआरबी सत्र में चर तक पहुंचने का प्रयास करके देख सकते हैं।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स जब कोई प्रक्रिया बंद हो जाती है, तो उसके पर्यावरण चर नष्ट हो जाते हैं

यह वही प्रिंसिपल है जिसके कारण आपका सर्वर रीबूट होने पर, या जब आप अपने शेल से बाहर निकलते हैं तो पर्यावरण चर खो देते हैं। यदि आप चाहते हैं कि वे सभी सत्रों में बने रहें, तो आपको उन्हें किसी प्रकार की कॉन्फ़िगरेशन फ़ाइल जैसे .bashrc में संग्रहीत करना होगा। ।

एक प्रक्रिया अपने पैरेंट से पर्यावरण चर प्राप्त करती है

प्रत्येक प्रक्रिया में माता-पिता होते हैं। ऐसा इसलिए क्योंकि हर प्रोग्राम को किसी दूसरे प्रोग्राम से शुरू करना पड़ता है।

यदि आप विम को लॉन्च करने के लिए अपने बैश शेल का उपयोग करते हैं, तो विम का पैरेंट शेल है। यदि आपका रेल ऐप किसी छवि की पहचान करने के लिए इमेजमैजिक का उपयोग करता है, तो identify . के पैरेंट प्रोग्राम आपका रेल ऐप होगा।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स बाल प्रक्रियाएं अपने माता-पिता से env vars इनहेरिट करती हैं

नीचे दिए गए उदाहरण में, मैं अपनी IRB प्रक्रिया में $MARCO पर्यावरण चर का मान सेट कर रहा हूँ। फिर मैं बैक-टिक का उपयोग शेल आउट करने और उस वेरिएबल के मान को प्रतिध्वनित करने के लिए करता हूं।

चूंकि IRB मेरे द्वारा अभी बनाए गए शेल की मूल प्रक्रिया है, इसलिए इसे $MARCO पर्यावरण चर की एक प्रति प्राप्त होती है।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स रूबी में सेट किए गए पर्यावरण चर चाइल्ड प्रोसेस से विरासत में मिले हैं

माता-पिता अपने बच्चों को भेजे गए पर्यावरण चर को अनुकूलित कर सकते हैं

डिफ़ॉल्ट रूप से एक बच्चे को उसके माता-पिता के पास मौजूद हर पर्यावरण चर की प्रतियां प्राप्त होंगी। लेकिन इस पर माता-पिता का नियंत्रण होता है।

कमांड लाइन से, आप env प्रोग्राम का उपयोग कर सकते हैं। और बैश में बच्चे को माता-पिता पर सेट किए बिना env vars सेट करने के लिए एक विशेष सिंटैक्स होता है।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स माता-पिता पर सेट किए बिना बच्चे के लिए पर्यावरण चर सेट करने के लिए env कमांड का उपयोग करें

यदि आप रूबी के अंदर से खोल रहे हैं तो आप अपने ईएनवी हैश को बर्बाद किए बिना बाल प्रक्रिया में कस्टम पर्यावरण चर भी प्रदान कर सकते हैं। system के साथ बस निम्नलिखित सिंटैक्स का उपयोग करें विधि:

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स रूबी के सिस्टम मेथड में कस्टम एनवायरनमेंट वेरिएबल कैसे पास करें

बच्चे अपने माता-पिता के पर्यावरण चर सेट नहीं कर सकते हैं

चूंकि बच्चों को केवल प्रतियां . मिलती है उनके माता-पिता के पर्यावरण चर, बच्चे द्वारा किए गए परिवर्तनों का माता-पिता पर कोई प्रभाव नहीं पड़ता है।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स पर्यावरण चर "संदर्भ द्वारा" नहीं "मान से पारित" होते हैं

यहां, हम बैक-टिक सिंटैक्स का उपयोग शेल आउट करने के लिए करते हैं और एक पर्यावरण चर सेट करने का प्रयास करते हैं। जबकि वेरिएबल बच्चे के लिए सेट किया जाएगा, नया मान पैरेंट के लिए बबल नहीं होगा।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स बाल प्रक्रियाएं अपने माता-पिता के वातावरण को नहीं बदल सकती हैं

पर्यावरण में परिवर्तन चल रही प्रक्रियाओं के बीच समन्वयित नहीं होते हैं

नीचे दिए गए उदाहरण में मैं आईआरबी की दो प्रतियां साथ-साथ चला रहा हूं। एक IRB सत्र के परिवेश में एक चर जोड़ने से दूसरे IRB सत्र पर कोई प्रभाव नहीं पड़ता है।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स पर्यावरण चर को एक प्रक्रिया में जोड़ने से यह अन्य प्रक्रियाओं के लिए नहीं बदलता है

आपका शेल पर्यावरण चर प्रणाली के लिए केवल एक UI है।

सिस्टम ही OS कर्नेल का हिस्सा है। इसका मतलब है कि शेल में पर्यावरण चर पर कोई जादुई शक्ति नहीं है। इसे उन्हीं नियमों का पालन करना होगा जो आपके द्वारा चलाए जाने वाले प्रत्येक अन्य कार्यक्रम के समान हैं।

पर्यावरण चर शेल चर के समान नहीं हैं

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

लेकिन स्थानीय चर बच्चों को कॉपी नहीं किए जाते हैं।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स पर्यावरण चर शेल चर के समान नहीं हैं

आइए एक उदाहरण देखें। सबसे पहले मैंने MARCO नाम का एक स्थानीय शेल वेरिएबल सेट किया। चूंकि यह एक स्थानीय चर है, इसलिए इसे किसी भी चाइल्ड प्रोसेस में कॉपी नहीं किया जाता है। नतीजतन, जब मैं इसे रूबी के माध्यम से प्रिंट करने का प्रयास करता हूं, तो यह काम नहीं करता है।

इसके बाद, मैं स्थानीय चर को पर्यावरण चर में बदलने के लिए निर्यात कमांड का उपयोग करता हूं। अब यह इस शेल द्वारा बनाई गई हर नई प्रक्रिया में कॉपी हो गया है। अब पर्यावरण चर रूबी के लिए उपलब्ध है।

रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स स्थानीय चर चाइल्ड प्रोसेस के लिए उपलब्ध नहीं हैं। निर्यात स्थानीय चर को पर्यावरण चर में परिवर्तित करता है।

प्रैक्टिस में पर्यावरण चर प्रबंधित करना

वास्तविक दुनिया में यह सब कैसे काम करता है? आइए एक उदाहरण करते हैं:

मान लीजिए कि आपके पास एक ही कंप्यूटर पर दो रेल ऐप चल रहे हैं। अपवादों के लिए इन ऐप्स की निगरानी के लिए आप हनीबैगर का उपयोग कर रहे हैं। लेकिन आप एक समस्या में फंस गए हैं।

आप अपनी हनीबैजर एपीआई कुंजी को $HONEYBADGER_API_KEY परिवेश चर में संग्रहीत करना चाहेंगे। लेकिन आपके दो ऐप्स में दो अलग-अलग API कुंजियां हैं।

एक पर्यावरण चर के दो अलग-अलग मान कैसे हो सकते हैं?

अब तक मुझे आशा है कि आपको उत्तर पता चल गया होगा। चूंकि env vars प्रति-प्रक्रिया हैं, और मेरे दो रेल ऐप्स अलग-अलग प्रक्रियाओं में चलाए जाते हैं, इसलिए कोई कारण नहीं है कि उनमें से प्रत्येक के पास $HONEYBADGER_API_KEY के लिए अपना मूल्य न हो।

अब एकमात्र सवाल यह है कि इसे कैसे स्थापित किया जाए। सौभाग्य से कुछ रत्न हैं जो इसे वास्तव में आसान बनाते हैं।

फिगारो

जब आप अपने रेल ऐप में फिगारो रत्न स्थापित करते हैं, तो आपके द्वारा config/application.yml में दर्ज किया गया कोई भी मान स्टार्टअप पर रूबी ईएनवी हैश में लोड किया जाएगा।

आप बस मणि स्थापित करें:

# Gemfile
gem "figaro"

और application.yml में आइटम जोड़ना शुरू करें। यह बहुत महत्वपूर्ण है कि आप इस फ़ाइल को अपने .gitignore में जोड़ दें, ताकि आप गलती से अपने रहस्यों को उजागर न करें।

# config/application.yml

HONEYBADGER_API_KEY: 12345

Dotenv

dotenv मणि फिगारो के समान है, सिवाय इसके कि यह .env से पर्यावरण चर लोड करता है, और यह YAML का उपयोग नहीं करता है।

बस मणि स्थापित करें:

# Gemfile

gem 'dotenv-rails'

और अपने कॉन्फ़िगरेशन मानों को .env में जोड़ें - और सुनिश्चित करें कि आप git फ़ाइल को अनदेखा करते हैं ताकि आप गलती से इसे github पर प्रकाशित न करें।

HONEYBADGER_API_KEY=12345

फिर आप अपने रूबी ईएनवी हैश में मानों तक पहुंच सकते हैं

ENV["HONEYBADGER_API_KEY"]

आप अपने पूर्व-निर्धारित env vars के सेट के साथ शेल में कमांड भी चला सकते हैं:

dotenv ./my_script.sh

Secrets.yml?

माफ़ करना। Secrets.yml - हालांकि शांत - पर्यावरण चर सेट नहीं करता है। तो यह वास्तव में Figaro और dotenv जैसे रत्नों का प्रतिस्थापन नहीं है।

सादा पुराना Linux

बुनियादी लिनक्स कमांड का उपयोग करके प्रति ऐप पर्यावरण चर के अद्वितीय सेट को बनाए रखना भी संभव है। एक तरीका यह है कि आपके सर्वर पर चलने वाले प्रत्येक ऐप का स्वामित्व एक अलग उपयोगकर्ता के पास हो। फिर आप एप्लिकेशन-विशिष्ट मानों को संग्रहीत करने के लिए उपयोगकर्ता के .bashrc का उपयोग कर सकते हैं।


  1. गीता के लिए शुरुआती गाइड

    यदि आप एक लिनक्स उपयोगकर्ता हैं, तो आप शायद किसी बिंदु पर गिट में आ सकते हैं, शायद एक नया प्रोग्राम डाउनलोड करने का प्रयास करते समय या सीवीएस या सबवर्जन जैसे संस्करण नियंत्रण प्रणालियों को देखते हुए। मौजूदा समाधानों के साथ संतुष्टि की कमी के कारण, गिट लिनक्स कर्नेल के प्रसिद्ध लिनुस टोरवाल्ड्स द्वार

  1. पर्यावरण चर सुरक्षित करना

    हमारे पिछले लेख, द रूबीस्ट्स गाइड टू एनवायरनमेंट वेरिएबल्स में, हमने आपको दिखाया कि पर्यावरण चर प्रणाली कैसे काम करती है, और कुछ सामान्य मिथकों का भंडाफोड़ किया। लेकिन जैसा कि एक मददगार पाठक ने बताया, हमने सुरक्षा के बारे में ज्यादा कुछ नहीं कहा। चूंकि गुप्त एपीआई कुंजी और अन्य मूल्यवान जानकारी संग

  1. रूबी में पर्यावरण चर का उपयोग कैसे करें?

    पर्यावरण चर एक कुंजी/मान युग्म है, यह इस तरह दिखता है: KEY=VALUE हम आपके कंप्यूटर के सभी प्रोग्रामों के बीच कॉन्फ़िगरेशन विकल्पों को साझा करने के लिए इन चरों का उपयोग करते हैं। इसलिए यह सीखना महत्वपूर्ण है कि वे कैसे काम करते हैं और ENV का उपयोग करके अपने रूबी कार्यक्रमों से उन्हें कैसे एक्सेस क