GNU/Linux >> Linux Esercitazione >  >> Linux

Come impostare le variabili di ambiente Linux con Ansible

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.


Linux
  1. Come impostare e annullare l'impostazione di variabili di ambiente locali, utente e a livello di sistema in Linux

  2. Variabili d'ambiente Linux:come leggere e impostare su un VPS Linux

  3. Come impostare/creare variabili di ambiente e shell in Linux

  4. Come impostare, elencare e rimuovere variabili d'ambiente in Linux

  5. Come stampare variabili d'ambiente apparentemente nascoste?

Come impostare ed elencare variabili ambientali in Linux

Come impostare/disimpostare le variabili d'ambiente in Linux

Come configurare un firewall con GUFW su Linux

Come impostare e annullare l'impostazione delle variabili di ambiente su Linux

Variabili d'ambiente Linux

Come installare e configurare WordPress con Ansible