Este dilema se puede tratar de diversas maneras, por lo tanto te mostramos la que en nuestra opinión es la solución más completa.
Solución:
Hay varias formas de hacer esto y, según su pregunta, no está claro lo que necesita.
1. Si necesita definir la variable de entorno 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 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 ciertos 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 solo 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.
No tenía suficiente reputación para comentar y, por lo tanto, estoy agregando una nueva respuesta.
La respuesta de Gasek es bastante correcta. Sólo 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 configurar 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 hizo 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 funcionaria, pero si lo hubiera hecho usando archivos de perfil, el 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.
Aquí hay una tarea local rápida para configurar permanentemente key/valores en /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 los vars para ello:
os_environment:
- key: DJANGO_SETTINGS_MODULE
value : websec.prod_settings
- key: DJANGO_SUPER_USER
value : admin
y, sí, si sales y vuelves a entrar, env
muestra las nuevas variables de entorno.
Tienes la posibilidad comunicar esta noticia si te valió la pena.