environment-variables - sirven - variable de entorno python linux
Capistrano: ¿Puedo establecer una variable de entorno para toda la sesión de tope? (5)
Creo que de hecho tienes 2 problemas:
1) Desea cambiar la RUTA en su (s) host (es) remoto (s).
Altee / establezca la ruta en su .bashrc en su (s) host (es) remoto y ejecute cap> printenv
, si su ruta es correcta, vaya a # 2, de lo contrario intente agregar export BASH_ENV=~/.bashrc
a su /etc/profile
( tenga cuidado, ~ / .bashrc se ejecutará para todos los shell no interactivos para todos los usuarios)
2) Quieres que sudo mantenga tu ruta
Ejecute visudo
en su (s) host (es) remoto (s) y agregue:
Defaults exempt_group = "<your_user>"
Tengo un servidor intermedio con Ruby y Ruby Enterprise instalados. Como estándar Ruby se rehúsa a instalar una gema crítica, necesito establecer $ PATH para que ruby / gem / rake / etc. siempre refiérase a las versiones REE. Y como utilizo Capistrano para implementar en nuestras máquinas, tengo que hacerlo en Capistrano.
¿Cómo puedo establecer una variable de entorno una vez y hacer que persista durante toda la sesión de Capistrano?
1) Es fácil de hacer en archivos bashrc, pero Capistrano no lee archivos bashrc.
2) Usaría el de Capistrano
default_environment[''PATH''] = ''Whatever''
pero Capistrano usa estas variables de entorno como
env PATH=Whatever command arg ...
y se pierden cada vez que otro shell se hila dentro del ejecutable pasado a env. Como cuando usas sudo. Lo cual es un poco importante:
[holt@Michaela trunk]$ env VAR=hello ruby -e "puts ENV[''VAR'']"
hello
[holt@Michaela trunk]$ env VAR=hello sudo ruby -e "puts ENV[''VAR'']"
nil
3) Y no puedo usar el comando bash export, ya que estos también se pierden: Capistrano parece iniciar un nuevo shell para cada comando (o algo así), y eso también se pierde:
cap> export MYVAR=12
[establishing connection(s) to xxx.xxx.xxx.xxx]
cap> echo $MYVAR
** [out :: xxx.xxx.xxx.xxx]
cap>
4) He tratado de jugar con las opciones de Capistrano: shell y: pty también (y en combinación con los otros enfoques), pero tampoco tuve suerte allí.
Entonces, ¿cuál es la forma correcta de hacer esto? Esto parece una tarea tan básica que debería haber una forma realmente simple de lograrlo, pero ya no tengo ideas. ¿Nadie?
¡Gracias por adelantado!
Intenté sin éxito utilizar la técnica de @ brian-deterling, que es bastante utilizada por otros que han discutido esto ... Tal vez estoy haciendo algo mal, pero mientras tanto encontré la gema dotenv-rails
, y funcionó muy bien para cargar valores arriba de un archivo .env
en mi raíz del proyecto.
Las instrucciones en su repositorio Github son bastante sencillas. Dotenv.load
a mi config/application.rb
Necesitaba establecer una variable de entorno para que una tarea específica funcionara. El comando "ejecutar" le permite pasar opciones que incluyen: env:
run "cmd", :env => { ''name'' => ''value'' }
En mi caso, quería agregar la variable de entorno a una tarea que no escribí, así que usé default_run_options, que es utilizada por todas las invocaciones de ejecución. Añadí esto a la parte superior de mi archivo Cap:
default_run_options[:env] = { ''name'' => ''value'' }
Si necesita establecer una variable en el host remoto que no sea PATH, debe saber que sshd solo permite determinadas variables de entorno /etc/profile
o ~/.bashrc
de forma predeterminada, por razones de seguridad. Como dijo Lou, puedes hacer cap shell
y usar el comando cap> printenv
, o puedes hacer un cap COMMAND=printenv invoke
en un comando.
Si ve la variable cuando ingresa al shell remoto normalmente, pero no lo ve en el comando cap printenv
, aquí hay una solución:
- Establezca
PermitUserEnvironment yes
en el/etc/ssh/sshd_config
su servidor remoto y reinicie sshd - Edite el archivo
~/.ssh/environment
para el usuario remoto en el que está ssh''ing, y ponga allí su (s) variable (s) comoVARIABLE=value
Ahora esos deberían aparecer cuando cap COMMAND=printenv invoke
Tengo exactamente el mismo problema, pero creo que esta solución es mejor:
set :default_environment, {
''env_var1'' => ''value1'',
''env_var2'' => ''value2''
}
Esto funciona para mí como un encanto.