Questa è l'opzione migliore. Come ha affermato Michal Gasek (prima risposta), poiché la richiesta pull è stata unita (https://github.com/ansible/ansible/pull/8651), siamo in grado di impostare variabili di ambiente permanenti facilmente per livello di gioco.
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value
Esistono diversi modi per farlo e dalla tua domanda non è chiaro di cosa hai bisogno.
1. Se hai bisogno che la variabile d'ambiente sia definita SOLO PER TASK, fai questo:
- 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"
Nota che MY_ENV_VARIABLE
è disponibile SOLO per la prima attività, environment
non lo imposta in modo permanente sul tuo sistema.
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": ""}
Si spera presto usando environment
sarà possibile anche a livello di gioco , non solo a livello di attività come sopra. Attualmente è aperta una richiesta pull per questa funzione su GitHub di Ansible:https://github.com/ansible/ansible/pull/8651
AGGIORNAMENTO:ora è unito a partire dal 2 gennaio 2015.
2. Se vuoi una variabile d'ambiente permanente + a livello di sistema / solo per determinati utenti
Dovresti esaminare come lo fai nella tua distribuzione / shell Linux, ci sono più posti per questo. Ad esempio in Ubuntu lo definisci in file come ad esempio:
~/.profile
/etc/environment
/etc/profile.d
cartella- ...
Troverai i documenti di Ubuntu a riguardo qui:https://help.ubuntu.com/community/EnvironmentVariables
Dopotutto per aver impostato la variabile di ambiente in ex. Ubuntu puoi semplicemente usare lineinfile
module da Ansible e aggiungi la riga desiderata a un determinato file. Consulta i documenti del tuo sistema operativo per sapere dove aggiungerlo per renderlo permanente.
Ecco una rapida attività locale per impostare in modo permanente chiavi/valori su /etc/environment
(che è a livello di sistema, tutti gli utenti):
- name: populate /etc/environment
lineinfile:
path: "/etc/environment"
state: present
regexp: "^{{ item.key }}="
line: "{{ item.key }}={{ item.value}}"
with_items: "{{ os_environment }}"
e le relative variabili:
os_environment:
- key: DJANGO_SETTINGS_MODULE
value : websec.prod_settings
- key: DJANGO_SUPER_USER
value : admin
e, sì, se esci e rientri con ssh, env
mostra le nuove variabili d'ambiente.
p.s. Era dest
come in:
dest: "/etc/environment"
ma guarda il commento
Solo per l'attività:l'inserimento funziona, qualche volta .
——————-
Nota:quanto segue è più un'osservazione/esperimento che una raccomandazione.——————-
Il primo compito è l'equivalente della risposta più votata di Michael.
Il secondo non funziona, ma poi di nuovo foo=1 echo $foo
non funziona neanche in bash (sospetto che sia perché echo
è integrato).
Il terzo funziona , come in bash, e richiede uno sforzo minimo. Tuttavia... quando ho provato a farlo per impostare una variabile nodo, ha fallito miseramente finché non ho usato la risposta di 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"
uscita:
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
Non avevo abbastanza reputazione per commentare e quindi aggiungo una nuova risposta.
La risposta di Gasek è abbastanza corretta. Solo una cosa:se stai aggiornando il .bash_profile
o il /etc/profile
, tali modifiche si rifletteranno solo dopo aver eseguito un nuovo accesso. Nel caso in cui desideri impostare la variabile env e quindi utilizzarla nelle attività successive nello stesso playbook, prendi in considerazione l'aggiunta di tali variabili di ambiente nel .bashrc
file.
Immagino che il motivo alla base di ciò sia il login e le shell non di login.
Ansible, durante l'esecuzione di diverse attività, legge i parametri da un .bashrc
file invece del .bash_profile
o il /etc/profile
.
Ad esempio, se aggiorno la mia variabile path per includere il binario personalizzato nel file .bash_profile
file del rispettivo utente e poi ha fatto una fonte del file. Le prossime attività successive non riconosceranno il mio comando. Tuttavia, se aggiorni nel file .bashrc
file, il comando funzionerebbe.
- 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";
Funzionerebbe , ma l'avevo fatto usando i file di profilo mysql -e "show databases"
avrebbe dato un errore.
- 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";
Questo non funzionerà , se abbiamo tutte queste attività nello stesso playbook.