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

95

Hola, estoy tratando de averiguar cómo configurar la variable de entorno con Ansible.

algo que un simple comando de shell como este:

EXPORT LC_ALL=C

Intenté como comando de shell y obtuve un error al intentar usar el módulo de entorno y no pasó nada.

Qué me estoy perdiendo

Gleeb
fuente
1
¿Necesita configurarlo en una cuenta en particular ($ HOME / .profile, predeterminado (/ etc / profile) o simplemente hacer que esté disponible antes de instalar o ejecutar una aplicación?
BMW
Necesito configurarlo para poder usar la consola mongodb. Después de levantar la máquina, no puedo entrar en la consola sin exportar esta variable
Gleeb
ok, estás hablando del módulo mongodb en ansible, entonces ¿por qué no ponerlo directamente cuando preparas ese módulo (instalar, configurar el archivo de configuración o iniciar su servicio)?
BMW
1
¿Qué tiene que ver la configuración de una variable de entorno con el módulo mongodb? Y no lo usé en absoluto. Todo lo que quiero es instalar mongo, configurar env var e iniciar aervice
Gleeb
¿Entonces no tenías listo ese módulo mongodb? entonces necesitas dedicarle tiempo primero, entonces tu problema no es un problema.
BMW

Respuestas:

157

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 lo siguiente:

- 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_VARIABLEestá disponible SOLO para la primera tarea, environmentno lo configura 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": ""}

Con suerte, el uso pronto environmenttambién será posible en el nivel de juego , no solo en el nivel de tarea como el anterior. 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 cierto usuario

Debería ver cómo lo hace en su distribución / shell de Linux, hay varios lugares para eso. Por ejemplo, en Ubuntu lo define 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 configurar la variable de entorno en ex. Ubuntu, puede usar el lineinfilemódulo de Ansible y agregar la línea deseada a cierto archivo. Consulte los documentos de su sistema operativo para saber dónde agregarlo para que sea permanente.

Michal Gasek
fuente
6
La segunda opción es la que necesitaba. Llegué a la solución yo mismo, pero esa es la única.
Gleeb
2
Actualización rápida: la solicitud de extracción n. ° 8651 para Ansible se fusionó, por lo que ahora es posible hacer esto también en el nivel de juego.
Michal Gasek
8
Entonces, ¿no hay forma de establecer variables de entorno persistentes a través de Ansible?
recolector de basura
1
@DumpHole He usado el rol "franklinkim.environment" de Ansible Galaxy para eso.
Ates Goral
1
¿Qué sucede si desea establecer un entorno variable solo para el shell bash actual? por ejemplo, una contraseña descifrada podría usarse de esta manera.
openCivilisation
28

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_profilearchivo o el /etc/profile, esos cambios se reflejarán solo después de que realice 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 .bashrcarchivo.
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 .bashrcarchivo en lugar de .bash_profileo el /etc/profile.

Como ejemplo, si actualicé mi variable de ruta para incluir el binario personalizado en el .bash_profilearchivo 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 .bashrcarchivo, el comando funcionará.

 - 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"habría 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";

Éste no va a funcionar , si tenemos todas estas tareas en el mismo libro de jugadas.

gaurav parashar
fuente
2
Si el shell predeterminado es sh, es posible que la fuente no funcione. En lugar de source filehacerlo. file
Cloverr
12

Aquí hay una tarea local rápida para establecer claves / valores permanentemente /etc/environment(que es para todo el sistema, todos los usuarios):

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

y las 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, envmuestra las nuevas variables de entorno.

JL Peyret
fuente
destfue reemplazado por path, pero según los documentos aún debería funcionar. Si no es así, cambie a path.
guessimtoolate
9

Para configurar constantemente las variables de entorno, puede utilizar uno de los roles existentes en Ansible Galaxy. Recomiendo que estemos en un entorno interactivo .

Usando ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

Usando Requirements.yml:

- src: franklinkim.environment

Luego, en tu libro de jugadas:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
Ates Goral
fuente
@openCivilisation ¡Actualizado!
Ates Goral
nota: weareinteractive.environment escribe en / etc / environment
simohe
5

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
lauralacarra
fuente
2
¿El entorno se ejecuta antes que el rol? Porque mi búsqueda todavía está vacía.
EvgenyKolyakov
Incluso mi búsqueda está vacía independientemente del orden
AhmFM
La única advertencia sobre esto es que los entornos en el nivel del libro de jugadas se resolverán antes de que se ejecute el libro de jugadas. Esto será útil si conoce todos los valores de antemano, pero si desea agregar un valor dinámicamente, le sugiero que siga la respuesta de JL Peyret
Bubzsan