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