GNU/Linux >> Belajar Linux >  >> Linux

Cara mengatur variabel lingkungan Linux dengan Ansible

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

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

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

1. Jika Anda memerlukan variabel lingkungan untuk ditentukan HANYA PER TUGAS, 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_VARIABLE tersedia HANYA untuk tugas pertama, environment tidak menyetelnya 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": ""}

Semoga segera menggunakan environment juga akan dimungkinkan pada tingkat permainan , tidak hanya tingkat tugas seperti di atas. Saat ini ada permintaan tarik terbuka untuk fitur ini di GitHub Ansible:https://github.com/ansible/ansible/pull/8651

PEMBARUAN:Sekarang telah digabungkan pada 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 mendefinisikannya dalam file seperti misalnya:

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

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

Lagi pula untuk mengatur variabel lingkungan di ex. Ubuntu Anda cukup menggunakan lineinfile modul dari Ansible dan tambahkan baris yang diinginkan ke file tertentu. Lihat dokumen OS Anda untuk mengetahui di mana harus menambahkannya agar permanen.


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

- name: populate /etc/environment
  lineinfile:


    path: "/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 keluar dan masuk kembali, env menunjukkan variabel lingkungan baru.

hal. Dulu dest seperti pada:

    dest: "/etc/environment"

tapi lihat komentarnya

Untuk tugas saja:inlining berfungsi, kadang-kadang .

——————-

Catatan:hal-hal di bawah ini lebih merupakan observasi/eksperimen daripada rekomendasi.——————-

Tugas pertama setara dengan jawaban pilihan teratas Michael.

Yang kedua tidak berfungsi, tetapi sekali lagi foo=1 echo $foo tidak berfungsi di bash juga (saya menduga itu karena echo adalah bawaan).

yang ketiga berfungsi , seperti halnya di bash, dan membutuhkan sedikit usaha. Namun... ketika saya mencoba melakukan ini untuk menyetel variabel simpul, gagal total sampai saya menggunakan jawaban Michael.

  tasks:
    - name: Echo my_env_var
      shell: "echo $MY_ENV_VARIABLE"
      environment:
        MY_ENV_VARIABLE: value1  

    - name: Echo my_env_var inline, doesnt work in bash either
      shell: "MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE"

    - name: set my_env_var inline then env
      shell: "MY_ENV_VARIABLE=value3 env | egrep MY_ENV"


keluaran:

TASK [Echo my_env_var] *********************************************************
changed: [192.168.63.253] => changed=true 
  cmd: echo $MY_ENV_VARIABLE
  stdout: value1

TASK [Echo my_env_var inline, doesnt work in bash either] **********************
changed: [192.168.63.253] => changed=true 
  cmd: MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE
  stdout: ''

TASK [set my_env_var inline then env] ******************************************
changed: [192.168.63.253] => changed=true 
  cmd: MY_ENV_VARIABLE=value3 env | egrep MY_ENV
  stdout: MY_ENV_VARIABLE=value3

Saya tidak memiliki reputasi yang cukup untuk berkomentar dan karenanya saya menambahkan jawaban baru.
Jawaban Gasek cukup benar. Hanya satu hal:jika Anda memperbarui .bash_profile file atau /etc/profile , perubahan tersebut akan tercermin hanya setelah Anda melakukan login baru. Jika Anda ingin menyetel variabel env dan kemudian menggunakannya dalam tugas selanjutnya di buku pedoman yang sama, pertimbangkan untuk menambahkan variabel lingkungan tersebut di .bashrc mengajukan.
Saya kira alasan di balik ini adalah login dan shell non-login.
Kemungkinan, saat menjalankan tugas yang berbeda, membaca parameter dari .bashrc file alih-alih .bash_profile atau /etc/profile .

Sebagai contoh, jika saya memperbarui variabel path saya untuk menyertakan biner khusus di .bash_profile file dari masing-masing pengguna dan kemudian melakukan sumber file. Tugas selanjutnya berikutnya tidak akan mengenali perintah saya. Namun jika Anda memperbarui di .bashrc file, perintah akan bekerja.

 - 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 apakah saya telah melakukannya menggunakan file profil 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 playbook yang sama.


Linux
  1. Cara Mengatur dan Menghapus Variabel Lingkungan Lokal, Pengguna dan Sistem di Linux

  2. Variabel Lingkungan Linux:Cara Membaca dan Mengatur di VPS Linux

  3. Cara Mengatur/Membuat Variabel Lingkungan dan Shell di Linux

  1. Cara Mengatur, Mendaftar, dan Menghapus Variabel Lingkungan di Linux

  2. Contoh Perintah Ekspor Linux (Cara Mengatur Variabel Lingkungan)

  3. Variabel Lingkungan Pengguna Dengan "su" dan "sudo" di Linux

  1. Cara menggunakan Ansible untuk mengatur pemantauan sistem dengan Prometheus

  2. Tetapkan variabel lingkungan dengan ruang di Linux

  3. Bagaimana cara mencetak variabel lingkungan yang tampaknya tersembunyi?