GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo configurar las variables de entorno de Linux con Ansible

Esta es la mejor opcion. Como dijo Michal Gasek (primera respuesta), dado que la solicitud de extracción se fusionó (https://github.com/ansible/ansible/pull/8651), podemos establecer variables de entorno permanentes fácilmente por nivel de juego.

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

Hay varias formas de hacer esto y, a partir de su pregunta, no está claro lo que necesita.

1. Si necesita que la variable de entorno se defina SOLO POR TAREA, haga esto:

- 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"

Tenga en cuenta que MY_ENV_VARIABLE está disponible SOLO para la primera tarea, environment no lo establece de forma permanente en su 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": ""}

Esperemos que pronto use environment también será posible en nivel de juego , no solo el nivel de tarea como se indicó anteriormente. Actualmente hay una solicitud de extracción abierta para esta función en GitHub de Ansible:https://github.com/ansible/ansible/pull/8651

ACTUALIZACIÓN:ahora se fusionó a partir del 2 de enero de 2015.

2. Si desea una variable de entorno permanente + todo el sistema/solo para determinados usuarios

Debería ver cómo lo hace en su distribución / shell de Linux, hay varios lugares para eso. Por ejemplo en Ubuntu lo defines en archivos como por ejemplo:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d directorio
  • ...

Encontrará documentos de Ubuntu al respecto aquí:https://help.ubuntu.com/community/EnvironmentVariables

Después de todo, para establecer la variable de entorno en ej. Ubuntu puedes usar lineinfile módulo de Ansible y agregue la línea deseada a cierto archivo. Consulte los documentos de su sistema operativo para saber dónde agregarlo para que sea permanente.


Aquí hay una tarea local rápida para establecer valores/clave de forma permanente en /etc/environment (que es para todo el sistema, todos los usuarios):

- name: populate /etc/environment
  lineinfile:


    path: "/etc/environment"

    state: present
    regexp: "^{{ item.key }}="
    line: "{{ item.key }}={{ item.value}}"
  with_items: "{{ os_environment }}"

y los vars para ello:

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

y sí, si sale y vuelve a entrar, env muestra las nuevas variables de entorno.

PD. Solía ​​ser dest como en:

    dest: "/etc/environment"

pero mira el comentario

Solo para la tarea:trabajos en línea, algunas veces .

——————-

Nota:lo siguiente es más una observación/experimento que una recomendación.——————-

La primera tarea es el equivalente a la respuesta más votada de Michael.

El segundo no funciona, pero de nuevo foo=1 echo $foo tampoco funciona en bash (sospecho que es porque echo es un incorporado).

El tercero sí funciona , como lo hace en bash, y requiere muy poco esfuerzo. Sin embargo... cuando intenté hacer esto para establecer una variable de nodo, falló miserablemente hasta que usé la respuesta de 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"


salida:

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

No tenía suficiente reputación para comentar y, por lo tanto, estoy agregando una nueva respuesta.
La respuesta de Gasek es bastante correcta. Solo una cosa:si está actualizando el .bash_profile archivo o el /etc/profile , esos cambios se reflejarán solo después de realizar un nuevo inicio de sesión. En caso de que desee establecer la variable env y luego usarla en tareas posteriores en el mismo libro de jugadas, considere agregar esas variables de entorno en el .bashrc expediente.
Supongo que la razón detrás de esto es el inicio de sesión y los shells de no inicio de sesión.
Ansible, mientras ejecuta diferentes tareas, lee los parámetros de un .bashrc archivo en lugar del .bash_profile o el /etc/profile .

Como ejemplo, si actualicé mi variable de ruta para incluir el binario personalizado en el .bash_profile archivo del usuario respectivo y luego hice una fuente del archivo. Las siguientes tareas posteriores no reconocerán mi comando. Sin embargo, si actualiza en el .bashrc archivo, el comando funcionaría.

 - 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";

Esto funcionaría , pero si lo hubiera hecho usando archivos de perfil mysql -e "show databases" hubiera dado un error.

- 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";

Este no funcionará , si tenemos todas estas tareas en el mismo libro de jugadas.


Linux
  1. Cómo usar Ansible para configurar el monitoreo del sistema con Prometheus

  2. Variables de entorno de Linux:cómo leer y configurar en un VPS de Linux

  3. Cómo establecer/crear variables de entorno y shell en Linux

  4. Establecer variable de entorno con espacio en Linux

  5. ¿Cómo imprimir variables de entorno aparentemente ocultas?

Cómo establecer y enumerar variables ambientales en Linux

Cómo configurar/desconfigurar variables de entorno en Linux

Cómo configurar un cortafuegos con GUFW en Linux

Cómo configurar y desactivar variables de entorno en Linux

Variables de entorno de Linux

Cómo instalar y configurar WordPress con Ansible