Puedo enviar ssh al host remoto y hacer una source /home/username/.bashrc
- todo funciona bien. Sin embargo, si lo hago:
- name: source bashrc
sudo: no
action: command source /home/username/.bashrc
Yo obtengo:
failed: [hostname] => {"cmd": ["source", "/home/username/.bashrc"], "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory
No tengo idea de lo que estoy haciendo mal ...
source
solo tiene sentido cuando lo ejecuta dentro de un shell existente: ejecuta comandos en ese shell y, por lo tanto, solo es útil / útil cuando hay un shell existente cuyo estado o configuración desea cambiar. Cuando ejecuta una acción ansible, eso crea un shell completamente nuevo y ejecuta un comando dentro de ese shell, por lo que no estaría actualizando las variables de entorno en ningún otro contexto, por lo que en realidad no tendría ningún efecto útil / duradero , incluso si logra que esto se ejecute sin errores.source
solo define variables durante la duración del shell en el que se ejecuta . Y ese shell ha salido (y las variables que define se han perdido) en el momento en que el comando ansible sale y comienza el siguiente.source
, antes de salir.source
trabajo funcione de la manera más probable.Respuestas:
Tiene dos opciones para usar la fuente con ansible. Una es con el comando "shell:" y / bin / sh (el valor predeterminado de ansible). "fuente" se llama "." en / bin / sh. Entonces tu comando sería:
Tenga en cuenta que debe ejecutar un comando después de obtener .bashrc b / c cada sesión ssh es distinta: cada comando ansible se ejecuta en una transacción ssh separada.
Su segunda opción es forzar a Ansible shell a usar bash y luego puede usar el comando "fuente":
Finalmente, señalaré que es posible que desee obtener "/ etc / profile" si está en Ubuntu o similar, que simula más completamente un inicio de sesión local.
fuente
.
->source
- e inmediatamente hizo esto :)source "/etc/profile"
, no funcionó para mí. Esto funcionó:source "~/.profile"
shell: . ~/.bashrc && nvm install {{ node_version }}
y dicenvm command not found
. ¿Como puedo resolver esto?Entonces
command
solo ejecutará ejecutables.source
per se no es un ejecutable. (Es un comando de shell incorporado). ¿Hay alguna razón por la que deseesource
una variable de entorno completa?Hay otras formas de incluir variables de entorno en Ansible. Por ejemplo, la
environment
directiva:Otra forma es usar el
shell
módulo Ansible:o
En estos casos, la instancia / entorno de shell terminará una vez que se ejecute el paso de Ansible.
fuente
shell source /home/username/.bashrc
convierte enshell . /home/username/.bashrc
executable=/usr/bin/bash
que luego lo ejecutará en bash si está disponible como tal.Sé que esta respuesta llegó demasiado tarde, pero he visto en suficiente código que puede usar la opción sudo
-i
para:Como se dice en la documentación
fuente
Estaba experimentando el mismo problema al intentar que virtualenvwrapper funcionara en un servidor Ubuntu. Estaba usando Ansible así:
pero el comando de origen no funcionaba.
Finalmente descubrí que el archivo .bashrc tiene algunas líneas en la parte superior del archivo que impiden que la fuente funcione cuando Ansible lo llama:
Comenté esas líneas en .bashrc y todo funcionó como se esperaba después de eso.
fuente
.bashrc
archivos. Probablemente desee obtener un archivo de shell diferente o usarloBASH_ENV
como se explica en los documentos de bash.Bueno, probé las respuestas enumeradas, pero no me funcionaron al instalar ruby a través de rbenv . Tuve que buscar debajo de las líneas de
/root/.bash_profile
Finalmente, se me ocurrió esto
Uno puede usar esto con cualquier comando.
fuente
2.2.0.0
. Sin embargo, me molesta que deba usarbecome
,become_method
y en subecome_user
lugar ... no pude encontrar una combinación de esos parámetros de "método" que funcionarían de todos modos.Encontré convertido en la mejor solución:
Puede cambiar el usuario agregando (predeterminado: root):
Más información aquí: Ansible convertirse
fuente
Muchas respuestas recomiendan la fuente ~ / .bashrc, pero el problema principal es que el shell ansible no es interactivo y la implementación de ~ / .bashrc por defecto ignora el shell no interactivo (verifique su comienzo).
La mejor solución para ejecutar comandos como usuario después de su inicio de sesión interactivo ssh que encontré es:
bash: '-i' significa shell interactivo, por lo que .bashrc no se ignorará '-l' significa shell de inicio de sesión que obtiene el perfil de usuario completo
fuente
Probé todas las opciones anteriores con ansible 2.4.1.0 y nadie funciona hasta otros dos y aquí está el detalle para volver a producir el caso.
Y esta es la prueba ansible :
Y este es el resultado:
Hay dos opciones trabajadas:
shell: /bin/bash -ic 'ta'
shell: ssh -tt localhost /bin/bash -ci 'ta'
pero este requiere la entrada de contraseña localmente.fuente
Mis 2 centavos, i dado la vuelta al problema de abastecimiento
~/.nvm/nvm.sh
en~/.profile
y luego usarsudo -iu
como sugirieron en otra respuesta.Probado en enero de 2018 vs Ubuntu 16.04.5
fuente
La forma correcta debería ser:
Nota: es prueba en
ansible 2.0.2
versiónfuente