Ansible ile Linux ortam değişkenleri nasıl ayarlanır


101

Merhaba Ansible ile ortam değişkenini nasıl ayarlayacağımı bulmaya çalışıyorum.

basit bir kabuk komutunun böyle olduğu bir şey:

EXPORT LC_ALL=C

kabuk komutu olarak denendi ve ortam modülünü kullanarak bir hata denedi ve hiçbir şey olmadı.

Neyi kaçırıyorum


1
Bunu belirli bir hesapta ($ HOME / .profile, varsayılan (/ etc / profile) ayarlamanız mı yoksa bir uygulamayı yüklemeden veya çalıştırmadan önce kullanıma
BMW

Mongodb konsolunu kullanabilmem için ayarlamam gerekiyor. Makineyi yükselttikten sonra bu değişkeni dışa aktarmadan konsola
giremiyorum

tamam, ansible'da mongodb modülünden bahsediyorsunuz, o zaman neden modülü hazırlarken doğrudan koymuyorsunuz (kurulum, yapılandırma dosyası ayarlama veya hizmetini başlatma)?
BMW

1
Bir ortam değişkeninin nasıl ayarlanmasının mongodb modülüyle bir ilgisi vardır? Ve hiç kullanmadım. Tek istediğim,
mongo'yu

yani o mongodb modülünüz hazır değil miydi? o zaman önce bunun üzerinde zaman harcamalısın, o zaman problemin sorun olmaz.
BMW

Yanıtlar:


163

Bunu yapmanın birçok yolu vardır ve sorunuza göre neye ihtiyacınız olduğu net değildir.

1. Ortam değişkeninin YALNIZCA GÖREV BAŞINA tanımlanmasına ihtiyacınız varsa, şunu yaparsınız:

- 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_VARIABLESADECE ilk görev için mevcut olduğunu , environmentonu sisteminizde kalıcı olarak ayarlamadığını unutmayın.

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": ""}

Umarım yakında kullanmak environment, sadece yukarıdaki görev seviyesinde değil , oyun seviyesinde de mümkün olacaktır . Şu anda Ansible'ın GitHub'ında bu özellik için açık bir çekme isteği var: https://github.com/ansible/ansible/pull/8651

GÜNCELLEME: 2 Ocak 2015 itibariyle birleştirilmiştir.

2. Kalıcı ortam değişkeni + sistem çapında / yalnızca belirli kullanıcılar için istiyorsanız

Linux dağıtımınızda / kabuğunuzda bunu nasıl yaptığınıza bakmalısınız, bunun için birden fazla yer var. Örneğin Ubuntu'da bunu örneğin dosyalarda tanımlarsınız:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d dizin
  • ...

Bununla ilgili Ubuntu belgelerini burada bulabilirsiniz: https://help.ubuntu.com/community/EnvironmentVariables

Sonuçta, ex. Ubuntu lineinfile, Ansible'daki modülü kullanabilir ve istediğiniz satırı belirli bir dosyaya ekleyebilirsiniz. Kalıcı hale getirmek için nereye ekleyeceğinizi öğrenmek için işletim sistemi belgelerinize bakın.


6
İkinci seçenek ihtiyacım olan şey. Çözüme kendim ulaştım, ama bu o.
Gleeb

2
Hızlı güncelleme: Ansible için 8651 numaralı çekme isteği birleştirildi, bu nedenle artık bunu oyun düzeyinde de yapmak mümkün.
Michal Gasek

8
Yani Ansible aracılığıyla kalıcı ortam değişkenlerini ayarlamanın bir yolu yok mu?
garbagecollector

1
@DumpHole Bunun için Ansible Galaxy'den "franklinkim.environment" rolünü kullandım.
Ateş Goral

1
Ya yalnızca mevcut bash kabuğu için değişken bir ortam ayarlamak istiyorsanız? örneğin, şifresi çözülmüş bir parola bu şekilde kullanılabilir.
openCivilisation

30

Yorum yapacak kadar itibarım yoktu ve bu nedenle yeni bir cevap ekliyorum.
Gasek cevabı oldukça doğru. Tek bir şey var: .bash_profileDosyayı veya dosyayı güncelliyorsanız /etc/profile, bu değişiklikler yalnızca yeni bir oturum açtıktan sonra yansıtılır. Env değişkenini ayarlamak ve ardından aynı başucu kitabındaki sonraki görevlerde kullanmak istemeniz durumunda, bu ortam değişkenlerini .bashrcdosyaya eklemeyi düşünün .
Sanırım bunun arkasındaki sebep, oturum açma ve oturum açma olmayan kabuklar.
Ansible, farklı görevleri yerine getirirken, parametreleri veya .bashrcyerine bir dosyadan okur ..bash_profile/etc/profile

Örnek olarak, özel ikiliyi .bash_profileilgili kullanıcının dosyasına dahil etmek için yol değişkenimi güncellediysem ve daha sonra dosyanın bir kaynağını yaptıysam. Sonraki görevler benim komutumu tanımayacak. Ancak .bashrcdosyada güncelleme yaparsanız , komut çalışacaktır.

 - 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";

Bu işe yarardı , ancak bunu profil dosyalarını kullanarak yapmış olsaydım mysql -e "show databases"bir hata verirdi.

- 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";

Bu bir iş olmaz , aynı oyun kitabında bütün bu görevleri varsa.


2
Varsayılan kabuk sh ise, kaynak çalışmayabilir. source fileYapmak yerine. file
Cloverr

13

Anahtar / değerleri kalıcı olarak ayarlamak için hızlı bir yerel görev /etc/environment(sistem genelinde, tüm kullanıcılar):

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

ve bunun için değişkenler:

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

ve evet, dışarı çıkıp geri gelirseniz env, yeni ortam değişkenlerini gösterir.


destile değiştirildi path, ancak belgelere göre yine de çalışmalıdır. Olmazsa, geçiş yapın path.
tahmin et

9

Sürekli olarak ortam değişkenlerini ayarlamak için Ansible Galaxy'deki mevcut rollerden birini kullanabilirsiniz. Ben tavsiye weareinteractive.environment .

Ansible-galaxy kullanarak:

$ ansible-galaxy install weareinteractive.environment

Gereksinimleri.yml kullanarak:

- src: franklinkim.environment

Sonra oyun kitabınızda:

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

@openCivilisation Güncellendi!
Ateş Goral

not: weareinteractive.environment, / etc / environment içine yazıyor
simohe

5

Bu en iyi seçenektir. Michal Gasek'in dediği gibi (ilk cevap), çekme talebi birleştirildiğinden ( https://github.com/ansible/ansible/pull/8651 ), kalıcı ortam değişkenlerini oyun seviyesine göre kolayca ayarlayabiliyoruz .

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

2
Ortam rolden önce çalışıyor mu? Çünkü aramam hala boş.
EvgenyKolyakov


Bununla ilgili tek uyarı, başucu kitabı düzeyindeki ortamların başucu kitabı çalıştırılmadan önce çözüleceğidir. Önceden tüm değerleri biliyorsanız bu faydalı olacaktır, ancak dinamik olarak bir değer katmak istiyorsanız JL
Peyret'in
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.