कैसे Linux पर्यावरण चर को Ansible के साथ सेट करें


95

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

कुछ इस तरह एक साधारण खोल आदेश:

EXPORT LC_ALL=C

शेल कमांड के रूप में कोशिश की गई और पर्यावरण मॉड्यूल का उपयोग करके एक त्रुटि हुई और कुछ भी नहीं हुआ।

मैं क्या खो रहा हूँ


1
क्या आपको इसे विशेष खाते ($ HOME / .profile, default (/ etc / profile) में सेट करने या किसी एप्लिकेशन को इंस्टॉल करने या चलाने से पहले उपलब्ध कराने की आवश्यकता है?
BMW

मुझे इसे सेट करने की आवश्यकता है ताकि मैं मोंगोडब कंसोल का उपयोग कर सकूं। मशीन को ऊपर उठाने के बाद मैं इस चर को निर्यात करने के साथ कंसोल में नहीं जा सकता
Gleeb

ठीक है, आप ansible में mongodb मॉड्यूल के बारे में बात कर रहे हैं, तो जब आप उस मॉड्यूल को तैयार करते हैं तो इसे सीधे क्यों नहीं रखा जाता है (स्थापित करें, कॉन्फ़िगर फ़ाइल सेट करें या इसकी सेवा शुरू करें)?
बीएमडब्ल्यू

1
कैसे एक पर्यावरण चर की स्थापना करता है mongodb मॉड्यूल के साथ कुछ नहीं करना है। और मैंने इसका इस्तेमाल बिल्कुल नहीं किया। सभी मैं चाहता हूँ कि mongo को env var सेट करना है और aervice शुरू करना है
Gleeb

तो तुम उस mongodb मॉड्यूल तैयार नहीं था? फिर आपको पहले उस पर समय बिताने की ज़रूरत है, फिर आपकी समस्या समस्या नहीं है।
बीएमडब्ल्यू

जवाबों:


157

ऐसा करने के कई तरीके हैं और आपके प्रश्न से यह स्पष्ट नहीं है कि आपको क्या चाहिए।

1. यदि आपको केवल TASK के अनुसार पर्यावरण चर की आवश्यकता है, तो आप ऐसा करते हैं:

- hosts: dev
  tasks:
    - name: Echo my_env_var
      shell: "echo $MY_ENV_VARIABLE"
      environment:
        MY_ENV_VARIABLE: whatever_value

    - name: Echo my_env_var again
      shell: "echo $MY_ENV_VARIABLE"

ध्यान दें कि MY_ENV_VARIABLEकेवल पहले कार्य के लिए उपलब्ध है, environmentयह आपके सिस्टम पर स्थायी रूप से सेट नहीं होता है।

TASK: [Echo my_env_var] ******************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": "whatever_value"}

TASK: [Echo my_env_var again] ************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": ""}

उम्मीद है कि जल्द ही उपयोग environmentकरना खेल के स्तर पर भी संभव होगा , न केवल ऊपर के रूप में कार्य स्तर। वर्तमान में Ansible के GitHub पर इस सुविधा के लिए एक पुल अनुरोध खुला है: https://github.com/ansible/ansible/pull/8651

अद्यतन: यह अब 2 जनवरी 2015 के रूप में विलय कर दिया गया है।

2. यदि आप स्थाई पर्यावरण चर + प्रणाली को विस्तृत / केवल निश्चित उपयोगकर्ता के लिए चाहते हैं

आपको यह देखना चाहिए कि आप इसे अपने लिनक्स वितरण / शेल में कैसे करते हैं, इसके लिए कई स्थान हैं। उदाहरण के लिए उबंटू में आप इसे उदाहरण के लिए फाइलों में परिभाषित करते हैं:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d निर्देशिका
  • ...

आपको इसके बारे में उबंटू डॉक्स यहां मिलेंगे: https://help.ubuntu.com/community/EnvironmentVariables

पूर्व में पर्यावरण चर स्थापित करने के लिए आखिरकार। उबंटू आप बस lineinfileAnsible से मॉड्यूल का उपयोग कर सकते हैं और कुछ फ़ाइल में वांछित लाइन जोड़ सकते हैं। इसे स्थायी बनाने के लिए इसे जोड़ने के लिए अपने OS डॉक्स से परामर्श करें।


6
दूसरा विकल्प वह है जिसकी मुझे आवश्यकता है। मैं खुद समाधान तक पहुँच गया, लेकिन यह एक है।
ग्लीब

2
त्वरित अपडेट: अन्सिबल के लिए पुल अनुरोध # 8651 को विलय कर दिया गया था, इसलिए अब प्ले स्तर पर भी ऐसा करना संभव है।
मीकल गेसक

8
तो Ansible के माध्यम से लगातार पर्यावरण चर सेट करने का कोई तरीका नहीं है?
कचरा उठाने वाला

1
@DumpHole मैंने उसके लिए Ansible Galaxy से "franklinkim.environment" भूमिका का उपयोग किया है।
एटल गोरल

1
क्या होगा यदि आप केवल वर्तमान बैश शेल के लिए एक पर्यावरण चर सेट करना चाहते हैं? उदाहरण के लिए, डिक्रिप्ट किए गए पासवर्ड का इस तरह से उपयोग किया जा सकता है।
ओपनक्विविलाइजेशन

28

मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं थी और इसलिए मैं एक नया उत्तर जोड़ रहा हूं।
गैसेक उत्तर काफी सही है। बस एक चीज: यदि आप .bash_profileफ़ाइल अपडेट कर रहे हैं या नहीं /etc/profile, तो वे परिवर्तन आपको एक नया लॉगिन करने के बाद ही दिखाई देंगे। यदि आप env वैरिएबल सेट करना चाहते हैं और फिर उसी प्लेबुक में बाद के कार्यों में इसका उपयोग करते हैं, तो .bashrcफ़ाइल में उन पर्यावरण चर को जोड़ने पर विचार करें ।
मुझे लगता है कि इसके पीछे का कारण लॉगिन और गैर-लॉगिन गोले हैं।
अलग-अलग कार्यों को अंजाम देते समय, जवाबदेह, या के .bashrcबजाय एक फ़ाइल से मापदंडों को पढ़ता .bash_profileहै /etc/profile

एक उदाहरण के रूप में, यदि मैंने .bash_profileसंबंधित उपयोगकर्ता की फ़ाइल में कस्टम बाइनरी को शामिल करने के लिए अपना पथ चर अपडेट किया और फिर फ़ाइल का एक स्रोत किया। अगले बाद के कार्य मेरी आज्ञा को नहीं पहचानेंगे। हालाँकि यदि आप .bashrcफ़ाइल में अपडेट करते हैं, तो कमांड काम करेगा।

 - name: Adding the path in the bashrc files
   lineinfile: dest=/root/.bashrc line='export PATH=$PATH:path-to-mysql/bin' insertafter='EOF' regexp='export PATH=\$PATH:path-to-mysql/bin' state=present
 
-  - name: Source the bashrc file
   shell: source /root/.bashrc

 - name: Start the mysql client
   shell: mysql -e "show databases";

यह काम करेगा , लेकिन मैंने इसे प्रोफाइल फाइल का उपयोग करके किया mysql -e "show databases"होगा, इसमें त्रुटि हुई होगी।

- name: Adding the path in the Profile files
   lineinfile: dest=/root/.bash_profile line='export PATH=$PATH:{{install_path}}/{{mysql_folder_name}}/bin' insertafter='EOF' regexp='export PATH=\$PATH:{{install_path}}/{{mysql_folder_name}}/bin' state=present

 - name: Source the bash_profile file
   shell: source /root/.bash_profile

 - name: Start the mysql client
   shell: mysql -e "show databases";

यह एक काम नहीं करेगा , हम एक ही प्लेबुक में इन सभी कार्यों को किया है।


2
यदि डिफ़ॉल्ट शेल sh है, तो स्रोत काम नहीं कर सकता है। के बजाय source fileकरते. file
Cloverr

12

यहां कुंजी / मानों को स्थायी रूप से सेट करने का एक त्वरित स्थानीय कार्य है /etc/environment(जो सिस्टम-वाइड है, सभी उपयोगकर्ता):

- name: populate /etc/environment
  lineinfile:
    dest: "/etc/environment"
    state: present
    regexp: "^{{ item.key }}="
    line: "{{ item.key }}={{ item.value}}"
  with_items: "{{ os_environment }}"

और इसके लिए var:

os_environment:
  - key: DJANGO_SETTINGS_MODULE 
    value : websec.prod_settings  
  - key: DJANGO_SUPER_USER 
    value : admin

और, हाँ, यदि आप बाहर ssh और वापस अंदर, envनए वातावरण चर दिखाता है।


destके साथ प्रतिस्थापित किया गया था path, लेकिन डॉक्स के अनुसार अभी भी काम करना चाहिए। यदि यह नहीं है, तो स्विच करें path
अनुमान

9

पर्यावरण चर को लगातार स्थापित करने के लिए, आप मौजूदा गैलेक्सी पर मौजूदा भूमिकाओं में से एक का उपयोग कर सकते हैं। मैं weareinteractive.environment की सलाह देता हूं

प्रयोग करने योग्य-आकाशगंगा:

$ ansible-galaxy install weareinteractive.environment

आवश्यकताओं का उपयोग करना।

- src: franklinkim.environment

फिर अपनी प्लेबुक में:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging

@openCivilisation अपडेट किया गया!
एटल गोराल

नोट: weareinteractive.environment / etc / वातावरण में लिखता है
simohe

5

यह सबसे अच्छा विकल्प है। जैसा कि मीकल गसेक (पहला उत्तर) ने कहा, चूंकि पुल अनुरोध को विलय कर दिया गया था ( https://github.com/ansible/ansible/pull/8651 ), हम प्ले लेवल द्वारा आसानी से स्थायी पर्यावरण चर सेट करने में सक्षम हैं ।

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value

2
क्या भूमिका से पहले पर्यावरण चलाया जाता है? क्योंकि मेरी तलाश अभी भी खाली है।
इवगेनीकोलाकोव

यहां तक ​​कि मेरी खोज आदेश के बावजूद खाली है
AhmFM

इसके बारे में एकमात्र चेतावनी यह है कि प्लेबुक के स्तर पर वातावरण को प्लेबुक चलने से पहले हल किया जाएगा। यदि आप पहले से सभी मूल्यों को जानते हैं तो यह उपयोगी होगा, लेकिन यदि आप एक मान जोड़ना चाहते हैं तो मैं सुझाव देता हूं कि मैं जेएल पाइरेत के उत्तर का अनुसरण करूंगा
बुब्ज़ान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.