Cara mengatur variabel lingkungan Linux dengan Ansible


97

Hai Saya mencoba mencari tahu cara mengatur variabel lingkungan dengan Ansible.

sesuatu yang perintah shell sederhana seperti ini:

EXPORT LC_ALL=C

mencoba sebagai perintah shell dan mendapat kesalahan mencoba menggunakan modul lingkungan dan tidak ada yang terjadi.

apa yang saya lewatkan


1
Apakah Anda perlu mengaturnya di akun tertentu ($ HOME / .profile, default (/ etc / profile) atau hanya membuatnya tersedia sebelum menginstal atau menjalankan aplikasi?
BMW

Saya perlu mengaturnya agar saya dapat menggunakan konsol mongodb. Setelah saya menaikkan mesin saya tidak bisa masuk ke konsol tanpa mengekspor variabel ini
Gleeb

ok, Anda berbicara tentang modul mongodb di ansible, lalu mengapa tidak langsung meletakkannya saat Anda menyiapkan modul itu (instal, setel file config atau mulai layanannya)?
BMW

1
Bagaimana pengaturan variabel lingkungan ada hubungannya dengan modul mongodb. Dan saya tidak menggunakannya sama sekali. Yang saya inginkan hanyalah menginstal mongo mengatur env var dan memulai aervice
Gleeb

jadi Anda belum memiliki modul mongodb itu? maka Anda perlu meluangkan waktu untuk itu dulu, lalu masalah Anda bukanlah masalah.
BMW

Jawaban:


159

Ada banyak cara untuk melakukan ini dan dari pertanyaan Anda tidak jelas apa yang Anda butuhkan.

1. Jika Anda membutuhkan variabel lingkungan untuk didefinisikan PER TUGAS SAJA, Anda melakukan ini:

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

Perhatikan bahwa MY_ENV_VARIABLEHANYA tersedia untuk tugas pertama, environmenttidak mengaturnya secara permanen di sistem Anda.

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

Mudah-mudahan penggunaan environmentjuga akan dimungkinkan pada level bermain , tidak hanya level tugas seperti di atas. Saat ini ada permintaan tarik terbuka untuk fitur ini di Ansible's GitHub: https://github.com/ansible/ansible/pull/8651

UPDATE: Sekarang digabungkan mulai 2 Jan 2015.

2. Jika Anda ingin variabel lingkungan permanen + lebar sistem / hanya untuk pengguna tertentu

Anda harus melihat bagaimana Anda melakukannya di distribusi / shell Linux Anda, ada banyak tempat untuk itu. Misalnya di Ubuntu Anda menentukannya di file seperti misalnya:

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

Anda akan menemukan dokumen Ubuntu tentangnya di sini: https://help.ubuntu.com/community/EnvironmentVariables

Setelah semua untuk mengatur variabel lingkungan di ex. Ubuntu Anda bisa menggunakan lineinfilemodul dari Ansible dan menambahkan baris yang diinginkan ke file tertentu. Konsultasikan dokumen OS Anda untuk mengetahui di mana harus menambahkannya agar permanen.


6
Pilihan kedua adalah apa yang saya butuhkan. Saya mencapai solusinya sendiri, tapi itu satu-satunya.
Gleeb

2
Pembaruan cepat: Permintaan tarik # 8651 untuk Ansible telah digabungkan, jadi sekarang mungkin juga untuk melakukan ini di level permainan.
Michal Gasek

8
Jadi tidak ada cara untuk mengatur variabel lingkungan yang persisten melalui Ansible?
garbagecollector

1
@DumpHole Saya telah menggunakan peran "franklinkim.environment" dari Ansible Galaxy untuk itu.
Ates Goral

1
Bagaimana jika Anda ingin menetapkan variabel lingkungan untuk shell bash saat ini saja? misalnya, sandi yang didekripsi mungkin digunakan dengan cara ini.
openCivilisation

30

Saya tidak memiliki reputasi yang cukup untuk berkomentar dan karenanya saya menambahkan jawaban baru.
Jawaban Gasek benar sekali. Hanya satu hal: jika Anda memperbarui .bash_profilefile atau /etc/profile, perubahan itu akan terlihat hanya setelah Anda melakukan login baru. Jika Anda ingin menyetel variabel env dan kemudian menggunakannya dalam tugas berikutnya di pedoman yang sama, pertimbangkan untuk menambahkan variabel lingkungan tersebut di .bashrcfile.
Saya kira alasan di balik ini adalah shell login dan non-login.
Ansible, saat menjalankan tugas berbeda, membaca parameter dari .bashrcfile, bukan dari .bash_profileatau /etc/profile.

Sebagai contoh, jika saya memperbarui variabel jalur saya untuk menyertakan biner khusus dalam .bash_profilefile pengguna masing-masing dan kemudian melakukan sumber file. Tugas berikutnya tidak akan mengenali perintah saya. Namun jika Anda memperbarui .bashrcfile, perintah akan berfungsi.

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

Ini akan berhasil , tetapi jika saya melakukannya menggunakan file profil, itu mysql -e "show databases"akan memberikan kesalahan.

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

Yang ini tidak akan berfungsi , jika kita memiliki semua tugas ini di buku pedoman yang sama.


2
Jika shell default adalah sh, sumber mungkin tidak berfungsi. Alih-alih source filemelakukan. file
Cloverr

13

Berikut adalah tugas lokal cepat untuk secara permanen menyetel kunci / nilai /etc/environment(yang berlaku untuk seluruh sistem, semua pengguna):

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

dan vars untuk itu:

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

dan, ya, jika Anda ssh keluar dan masuk kembali, envmenampilkan variabel lingkungan baru.


destdiganti dengan path, tapi menurut dokumen harus tetap berfungsi. Jika tidak, alihkan ke path.
guessimtoolate

9

Untuk mengatur variabel lingkungan secara terus-menerus, Anda dapat menggunakan salah satu peran yang ada di Ansible Galaxy. Saya sarankan kami adalah lingkungan yang interaktif .

Menggunakan ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

Menggunakan Requirement.yml:

- src: franklinkim.environment

Kemudian di buku pedoman Anda:

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

@openCivilisation Diperbarui!
Ates Goral

catatan: weareinteractive.environment menulis ke / etc / environment
simohe

5

Ini adalah pilihan terbaik. Seperti yang dikatakan Michal Gasek (jawaban pertama), sejak pull request digabungkan ( https://github.com/ansible/ansible/pull/8651 ), kami dapat mengatur variabel lingkungan permanen dengan mudah berdasarkan level permainan.

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

2
Apakah lingkungan dijalankan sebelum peran tersebut? Karena pencarian saya masih kosong.
EvgenyKolyakov

Bahkan pencarian saya kosong terlepas dari urutannya
AhmFM

Satu-satunya peringatan tentang hal ini adalah bahwa lingkungan di tingkat pedoman akan diselesaikan sebelum pedoman berjalan. Ini akan berguna jika Anda mengetahui semua nilai sebelumnya, tetapi jika Anda ingin menambahkan nilai secara dinamis saya sarankan mengikuti jawaban JL Peyret
Bubzsan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.