Toto je nejlepší možnost. Jak řekl Michal Gasek (první odpověď), od sloučení požadavku na stažení (https://github.com/ansible/ansible/pull/8651) jsme schopni nastavit trvalé proměnné prostředí snadno podle úrovně hry.
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value
Existuje několik způsobů, jak to udělat, a z vaší otázky není jasné, co potřebujete.
1. Pokud potřebujete, aby byla proměnná prostředí definována POUZE NA ÚLOHU, postupujte takto:
- 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"
Všimněte si, že MY_ENV_VARIABLE
je k dispozici POUZE pro první úlohu, environment
nenastaví ji natrvalo ve vašem systému.
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": ""}
Doufejme, že brzy použijeme environment
bude také možné na úrovni hry , nejen na úrovni úkolu, jak je uvedeno výše. V současné době je na GitHubu Ansible otevřen požadavek na stažení této funkce:https://github.com/ansible/ansible/pull/8651
AKTUALIZACE:Nyní je sloučena od 2. ledna 2015.
2. Pokud chcete trvalé proměnné prostředí + celý systém / pouze pro určitého uživatele
Měli byste se podívat na to, jak to děláte ve vaší distribuci Linuxu / shellu, existuje pro to několik míst. Například v Ubuntu to definujete v souborech jako například:
~/.profile
/etc/environment
/etc/profile.d
adresář- ...
Dokumenty Ubuntu o tom najdete zde:https://help.ubuntu.com/community/EnvironmentVariables
Koneckonců pro nastavení proměnné prostředí v ex. Ubuntu stačí použít lineinfile
modul z Ansible a přidejte požadovaný řádek do určitého souboru. Chcete-li vědět, kam ji přidat, aby byla trvalá, poraďte se se svou dokumentací operačního systému.
Zde je rychlý místní úkol k trvalému nastavení párů klíč/hodnota na /etc/environment
(což platí pro celý systém, všichni uživatelé):
- name: populate /etc/environment
lineinfile:
path: "/etc/environment"
state: present
regexp: "^{{ item.key }}="
line: "{{ item.key }}={{ item.value}}"
with_items: "{{ os_environment }}"
a jeho varianty:
os_environment:
- key: DJANGO_SETTINGS_MODULE
value : websec.prod_settings
- key: DJANGO_SUPER_USER
value : admin
a ano, pokud se ssh odhlásíte a znovu se přihlásíte, env
ukazuje nové proměnné prostředí.
p.s. Dříve to bylo dest
jako v:
dest: "/etc/environment"
ale viz komentář
Pouze pro tento úkol:vkládání funguje, někdy .
——————-
Poznámka:níže uvedené věci jsou spíše pozorováním/experimentem než doporučením.——————-
První úkol je ekvivalentem Michaelovy odpovědi s nejvyšším hlasem.
Druhý nefunguje, ale pak znovu foo=1 echo $foo
nefunguje ani v bash (domnívám se, že je to proto, že echo
je vestavěný).
Třetí funguje , stejně jako v bash, a vyžaduje velmi málo úsilí. Nicméně... když jsem se o to pokusil nastavit proměnnou uzlu, selhalo to, dokud jsem nepoužil Michaelovu odpověď.
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"
výstup:
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
Neměl jsem dostatečnou pověst, abych se vyjádřil, a proto přidávám novou odpověď.
Gasek odpověď je zcela správná. Jen jedna věc:pokud aktualizujete .bash_profile
soubor nebo /etc/profile
, tyto změny se projeví až po novém přihlášení. V případě, že chcete nastavit proměnnou env a poté ji použít v následujících úlohách ve stejné příručce, zvažte přidání těchto proměnných prostředí do .bashrc
soubor.
Myslím, že důvodem je přihlašovací a nepřihlašovací shelly.
Ansible při provádění různých úloh čte parametry z .bashrc
namísto .bash_profile
nebo /etc/profile
.
Pokud jsem například aktualizoval svou proměnnou cesty tak, aby zahrnovala vlastní binární soubor v .bash_profile
souboru příslušného uživatele a poté provedl zdroj souboru. Další následné úkoly můj příkaz nerozpoznají. Pokud však aktualizujete v .bashrc
soubor, příkaz by fungoval.
- 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";
To by fungovalo , ale kdybych to udělal pomocí souborů profilu mysql -e "show databases"
by došlo k chybě.
- 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";
Tohle nebude fungovat , pokud máme všechny tyto úkoly ve stejné příručce.