2011-09-29 19 views
32

मुझे मानक रूबी और रूबी एंटरप्राइज़ दोनों के साथ एक स्टेजिंग सर्वर मिला है। चूंकि मानक रूबी एक महत्वपूर्ण मणि स्थापित करने से इंकार कर देता है, इसलिए मुझे $ पाथ सेट करना होगा ताकि रूबी/मणि/रेक/आदि। हमेशा आरईई संस्करणों का संदर्भ लें। और चूंकि मैं अपनी मशीनों पर तैनात करने के लिए कैपिस्ट्रानो का उपयोग करता हूं, इसलिए मुझे इसे कैपिस्ट्रानो में करने की ज़रूरत है।कैपिस्ट्रानो: क्या मैं पूरे कैप सत्र के लिए एक पर्यावरण चर सेट कर सकता हूं?

मैं एक बार पर्यावरण परिवर्तक कैसे सेट कर सकता हूं, और यह कैपिस्ट्रानो सत्र में जारी रहता है?

1) bashrc फ़ाइलों में करना आसान है, लेकिन Capistrano bashrc फ़ाइलों को नहीं पढ़ता है।

2) मैं का उपयोग करेंगे Capistrano के

default_environment['PATH'] = 'Whatever' 

लेकिन Capistrano तरह

env PATH=Whatever command arg ... 

इन वातावरण चर का उपयोग करता है और वे खो रहे हैं जब भी मुझे एक अन्य सुरक्षा निष्पादन env के लिए पारित भीतर काता है। जब आप सूडो का उपयोग करते हैं। ,

[[email protected] trunk]$ env VAR=hello ruby -e "puts ENV['VAR']" 
hello 
[[email protected] trunk]$ env VAR=hello sudo ruby -e "puts ENV['VAR']" 
nil 

3) और मैं बैश निर्यात आदेश का उपयोग नहीं कर सकते हैं के रूप में इन भी खो रहे हैं - Capistrano ऐसे ही प्रत्येक आदेश के लिए एक नया खोल (या कुछ शुरू करने लगता है), और: जो थोड़े महत्वपूर्ण है कि खो जाता है, भी:

cap> export MYVAR=12 
[establishing connection(s) to xxx.xxx.xxx.xxx] 
cap> echo $MYVAR 
** [out :: xxx.xxx.xxx.xxx] 
cap> 

4) मैं Capistrano के साथ खिलवाड़ की कोशिश की है: खोल और: Pty विकल्प के रूप में अच्छी तरह से (और अन्य तरीकों के साथ संयोजन में), लेकिन कोई किस्मत, या तो।

तो - ऐसा करने का सही तरीका क्या है? ऐसा लगता है कि यह एक बुनियादी कार्य है कि इसे पूरा करने का एक बहुत ही आसान तरीका होना चाहिए, लेकिन मैं विचारों से बाहर हूं। किसी को?

अग्रिम धन्यवाद!

उत्तर

5

मुझे लगता है कि आप 2 समस्याओं वास्तव में है:

1) आप अपने दूरस्थ होस्ट (ओं) पर पथ बदलना चाहते हैं।

ऑल्टर/अगर अपना रास्ता ठीक है, गोटो # 2, और है अपने /etc/profile (सावधान रहना, ~/करने के लिए export BASH_ENV=~/.bashrc जोड़ने का प्रयास करते हैं, अपने दूरस्थ होस्ट (रों) और cap> printenv चलाने पर अपने .bashrc में पथ सेट। bashrc तो सभी उपयोगकर्ताओं के लिए सभी गैर-सहभागी खोल)

2) आप sudo अपने दूरस्थ होस्ट (रों पर अपने पथ

भागो visudo रखना चाहते हैं के लिए चलाया जाएगा) और जोड़ें:

Defaults  exempt_group = "<your_user>" 
+0

अच्छी कॉल में जोड़ा - मुझे पता नहीं था कि सूडो ने स्थानीय पर्यावरण को अस्पष्ट कर दिया था। ऐसा लगता है कि -ई विकल्प को जोड़ना ज्यादातर मामलों को हल करता है, लेकिन $ PATH विशेष है ([संदर्भ] (http://stackoverflow.com/questions/257616/sudo-changes-path-why))। मैं इसके साथ थोड़ा और खेलूँगा और आपसे वापस आऊंगा। चीयर्स! –

9

यदि आपको पैथ के अलावा रिमोट होस्ट पर एक चर सेट करने की आवश्यकता है, तो आपको पता होना चाहिए कि एसएसडीडी सुरक्षा कारणों से डिफ़ॉल्ट रूप से कुछ /etc/profile या ~/.bashrc पर्यावरण चर को अनुमति देता है। जैसे लू ने कहा, आप या तो cap shell कर सकते हैं और cap> printenv कमांड का उपयोग कर सकते हैं, या आप एक कमांड में cap COMMAND=printenv invoke कर सकते हैं।

आप चर देखते हैं जब आप दूरस्थ खोल में सामान्य रूप से SSH, लेकिन आप टोपी printenv आदेश में यह दिखाई नहीं देता है, तो यहां एक ही समाधान है:

  1. सेट PermitUserEnvironment yes अपने दूरस्थ सर्वर के /etc/ssh/sshd_config फ़ाइल में, और sshd
  2. संपादित करें आप के रूप में में ssh'ing रहे हैं दूरस्थ उपयोगकर्ता के लिए ~/.ssh/environment फ़ाइल पुनरारंभ करें, और के रूप में VARIABLE=value

अपने चर (रों) डाल वहाँ अब उन दिखाई देना चाहिए जब आप cap COMMAND=printenv invoke

+0

यह काम कर सकता है, लेकिन इसके लिए रूट-विशेषाधिकार सेटिंग्स बदलना आवश्यक है। मेरा जवाब देखें –

3

मुझे किसी विशिष्ट कार्य के लिए एक पर्यावरण चर सेट करने की आवश्यकता होती है। env:: "रन" आदेश इस विकल्प जिसमें शामिल पारित करने के लिए अनुमति देता है

run "cmd", :env => { 'name' => 'value' } 

मेरे मामले में, मैं एक काम है कि मैं नहीं लिखा था करने के लिए वातावरण चर जोड़ना चाहते थे, इसलिए मैं default_run_options जो प्रयोग किया जाता है प्रयोग किया जाता है रन के सभी आमंत्रणों द्वारा। मैं अपने Capfile के शीर्ष करने के लिए इस कहा:

default_run_options[:env] = { 'name' => 'value' } 
+0

मैंने इस समाधान को कहीं और देखा है, लेकिन मैं इसे मेरे लिए काम नहीं कर सकता - मुझे मुख्य नाम के लिए 'नाम त्रुटि: अपरिभाषित स्थानीय चर या विधि' default_run_options 'मिलती है: ऑब्जेक्ट' त्रुटि। मैंने पहले 'नेमस्पेस: तैनाती करें 'ब्लॉक से पहले, मेरे' कैप्फ़ाइल 'के शीर्ष पर असाइनमेंट स्टेटमेंट रखा था। मैं अलग-अलग क्या कर सकता हूं? – sameers

+0

आप कार्य कैसे चला रहे हैं? यदि आप टोपी कार्य चलाते हैं, तो इसे लोड प्रक्रिया के दौरान default_run_options को परिभाषित करना चाहिए ताकि यह आपके कैपफ़ाइल तक पहुंचने तक उपलब्ध हो। यहां तक ​​कि एक-पंक्ति कैपफ़ाइल के साथ जो डिफ़ॉल्ट_run_options [: x] = {'y' => 'z'} कहता है, मैं टोपी खोल चला सकता हूं। –

46

मैं बिल्कुल वैसा ही समस्या है, लेकिन मुझे लगता है कि इस समाधान बेहतर है:

set :default_environment, { 
    'env_var1' => 'value1', 
    'env_var2' => 'value2' 
} 

यह एक आकर्षण की तरह मेरे लिए काम करता है।

+0

हम्म, मेरे लिए काम नहीं कर रहा है http://stackoverflow.com/questions/16889642/capistrano-environment-variable?lq=1 – juanpastas

+19

कैपिस्ट्रानो 3 में यह सेट है: default_env, {...} ' – Confusion

+1

बेवकूफ सवाल, लेकिन मैं वही बात कर रहा हूं और यह काम नहीं कर रहा है। वैसे भी इसे डीबग करने के लिए? – codenoob

0

मैंने @ ब्रायन-डाटरलिंग तकनीक का उपयोग करने में असफल प्रयास किया, जिसका उपयोग आमतौर पर उन लोगों द्वारा किया जाता है जिन्होंने इस पर चर्चा की है ... शायद मैं कुछ गलत कर रहा हूं, लेकिन इस बीच मुझे dotenv-rails मणि मिला, और यह बहुत अच्छी तरह से काम किया मेरे प्रोजेक्ट रूट में .env फ़ाइल से मूल्यों को लोड करने के लिए।

उनके Github repo पर निर्देश बहुत सीधे हैं। मैंने Dotenv.load को config/application.rb

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