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