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.