Come impostare le variabili di ambiente Linux con Ansible

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 shell e ottenuto un errore provato usando il modulo environment e niente è successo.

cosa mi manca?

Ci sono molti modi per farlo e dalla tua domanda non è chiaro cosa ti serve.

1. Se è necessario definire la variabile di ambiente PER SOLO TASK, 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à, l’ 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": ""} 

Speriamo che presto sarà ansible utilizzare l’ environment anche a livello di gioco , non solo il livello di attività come sopra. Al momento è disponibile una richiesta di 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 si desidera una variabile di ambiente permanente + system wide / only 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

Troverete i documenti di Ubuntu a riguardo qui: https://help.ubuntu.com/community/EnvironmentVariables

Dopotutto per l’impostazione della variabile di ambiente in es. Ubuntu puoi semplicemente usare il modulo lineinfile di Ansible e aggiungere la linea desiderata a determinati file. Consulta i documenti del tuo sistema operativo per sapere dove aggiungerlo per renderlo permanente.

Non ho avuto abbastanza reputazione per commentare e quindi sto aggiungendo una nuova risposta. La risposta di Gasek è abbastanza corretta. Solo una cosa, se stai aggiornando il file bash_profile o il file / etc / profile, queste modifiche si rifletteranno solo dopo aver effettuato un nuovo accesso. Nel caso in cui, si imposta la variabile env e quindi si desidera utilizzarlo nelle attività successive nella stessa cartella di gioco. Prendi in considerazione l’aggiunta di quelle variabili d’ambiente nel file .bashrc. Immagino che la ragione di questo sia il login e le shell non di login. Inevitabile, mentre eseguendo task diversi legge i parametri da un file .bashrc invece del file bash_profile o del file / etc / profile.

Ad esempio, se ho aggiornato la mia variabile di percorso per includere il binario personalizzato nel file .bash_profile del rispettivo utente, ho fatto una fonte del file. I prossimi compiti successivi non riconosceranno il mio comando. Tuttavia, se si aggiorna nel file .bashrc, 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"; 

Questo funzionerebbe , ma avevo fatto uso di file di profilo. il mysql -e “mostra database” 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 tutti questi compiti nello stesso playbook

Per variabili di ambiente con impostazione permanente, è ansible utilizzare uno dei ruoli esistenti su Ansible Galaxy. Raccomando franklinkim.environment .

Usando l’ansible-galaxy:

 $ ansible-galaxy install franklinkim.environment 

Utilizzando requirements.yml:

 - src: franklinkim.environment 

Quindi nel tuo libro di esercizi:

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

Ecco una rapida attività locale per impostare la chiave / i valori su /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 i varsali per questo:

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

e, sì, se si ssh out e back in, env mostra le nuove variabili di ambiente.