Come impostare le variabili d'ambiente Linux con Ansible


96

Ciao, sto cercando di scoprire come impostare la variabile di ambiente con Ansible.

qualcosa che un semplice comando di shell come questo:

EXPORT LC_ALL=C

provato come comando di shell e ho ottenuto un errore provato utilizzando il modulo ambiente e non è successo nulla.

cosa mi manca


1
Hai bisogno di impostarlo in un account particolare ($ HOME / .profile, default (/ etc / profile) o semplicemente renderlo disponibile prima di installare o eseguire un'applicazione?
BMW

Devo impostarlo su così posso usare la console mongodb. Dopo aver sollevato la macchina non posso entrare in console senza esportare questa variabile
Gleeb

ok, stai parlando del modulo mongodb in ansible, allora perché non metterlo direttamente quando prepari quel modulo (installa, imposta il file di configurazione o avvia il suo servizio)?
BMW

1
In che modo l'impostazione di una variabile d'ambiente ha a che fare con il modulo mongodb. E non l'ho usato affatto. Tutto quello che voglio è installare mongo, impostare env var e avviare aervice
Gleeb

quindi non avevi quel modulo mongodb pronto? quindi devi prima dedicarci del tempo, quindi il tuo problema non è un problema.
BMW

Risposte:


157

Ci sono diversi modi per farlo e dalla tua domanda non è chiaro di cosa hai bisogno.

1. Se è necessario definire la variabile d'ambiente SOLO PER ATTIVITÀ, procedere come segue:

- 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à, environmentnon 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 che presto l'utilizzo environmentsarà possibile anche a livello di gioco , non solo a livello di attività come sopra. Al momento è aperta una richiesta pull per questa funzione su GitHub di Ansible: https://github.com/ansible/ansible/pull/8651

AGGIORNAMENTO: ora è stato unito a partire dal 2 gennaio 2015.

2. Se si desidera una variabile di 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 directory
  • ...

Troverai la documentazione di Ubuntu al riguardo qui: https://help.ubuntu.com/community/EnvironmentVariables

Dopo tutto per l'impostazione della variabile d'ambiente in es. Ubuntu puoi semplicemente usare il lineinfilemodulo da Ansible e aggiungere la riga desiderata a un determinato file. Consulta i documenti del tuo sistema operativo per sapere dove aggiungerlo per renderlo permanente.


6
La seconda opzione è ciò di cui avevo bisogno. Ho raggiunto la soluzione da solo, ma è quella.
Gleeb

2
Aggiornamento rapido: la richiesta di pull # 8651 per Ansible è stata fusa, quindi ora è possibile farlo anche a livello di gioco.
Michal Gasek

8
Quindi non c'è modo di impostare variabili di ambiente persistenti tramite Ansible?
garbagecollector

1
@DumpHole Ho usato il ruolo "franklinkim.environment" di Ansible Galaxy per questo.
Ates Goral

1
Cosa succede se si desidera impostare un ambiente variabile solo per la shell bash corrente? ad esempio, una password decrittografata potrebbe essere utilizzata in questo modo.
openCivilisation

28

Non avevo abbastanza reputazione per commentare e quindi sto aggiungendo una nuova risposta.
La risposta di Gasek è abbastanza corretta. Solo una cosa: se stai aggiornando il .bash_profilefile o il /etc/profile, queste modifiche si rifletteranno solo dopo aver effettuato un nuovo accesso. Nel caso in cui desideri impostare la variabile env e quindi utilizzarla in attività successive nello stesso playbook, considera l'aggiunta di tali variabili di ambiente nel .bashrcfile.
Immagino che il motivo alla base di questo sia il login e le shell non di login.
Ansible, durante l'esecuzione di attività diverse, legge i parametri da un .bashrcfile anziché da .bash_profileo /etc/profile.

Ad esempio, se ho aggiornato la mia variabile di percorso per includere il binario personalizzato nel .bash_profilefile del rispettivo utente e poi ho fatto una fonte del file. Le attività successive successive non riconosceranno il mio comando. Tuttavia, se aggiorni il .bashrcfile, il comando funzionerà.

 - 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 se lo avessi fatto utilizzando i file di profilo, mysql -e "show databases"avrei 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.


2
Se la shell predefinita è sh, i sorgenti potrebbero non funzionare. Invece di source filefarlo. file
Cloverr

12

Ecco una rapida attività locale su cui impostare in modo permanente chiave / valori /etc/environment(che è a livello di sistema, tutti gli utenti):

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

e le variabili per esso:

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

e, sì, se esci e rientri, envmostra le nuove variabili d'ambiente.


destè stato sostituito con path, ma secondo i documenti dovrebbe ancora funzionare. In caso contrario, passa a path.
guessimtoolate l'

9

Per impostare in modo persistente le variabili di ambiente, è possibile utilizzare uno dei ruoli esistenti in Ansible Galaxy. Raccomando weareinteractive.environment .

Utilizzando ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

Utilizzo di requirements.yml:

- src: franklinkim.environment

Quindi nel tuo playbook:

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

@openCivilisation Aggiornato!
Ates Goral

nota: weareinteractive.environment scrive in / etc / environment
simohe il

5

Questa è l'opzione migliore. Come ha detto Michal Gasek (prima risposta), poiché la richiesta pull è stata fusa ( https://github.com/ansible/ansible/pull/8651 ), siamo in grado di impostare facilmente variabili di ambiente permanenti per livello di gioco.

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

2
L'ambiente viene eseguito prima del ruolo? Perché la mia ricerca è ancora vuota.
EvgenyKolyakov

Anche la mia ricerca è vuota indipendentemente dall'ordine
AhmFM

L'unico avvertimento a riguardo è che gli ambienti nel livello del playbook verranno risolti prima che il playbook venga eseguito. Questo sarà utile se conosci tutti i valori in anticipo, ma se vuoi aggiungere un valore dinamicamente ti suggerisco di seguire la risposta di JL Peyret
Bubzsan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.