2011-09-29 12 views
32

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.Capistrano: ¿Puedo establecer una variable de entorno para toda la sesión de tope?

¿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) que haría uso de Capistrano

default_environment['PATH'] = 'Whatever' 

pero Capistrano utiliza estas variables de entorno como

env PATH=Whatever command arg ... 

y se Pierden cada vez que otro proyectil se hace girar dentro del ejecutable pasado a env. Como cuando usas sudo. Lo cual es algo importante:

[[email protected] trunk]$ env VAR=hello ruby -e "puts ENV['VAR']" 
hello 
[[email protected] trunk]$ env VAR=hello sudo ruby -e "puts ENV['VAR']" 
nil 

3) Y no se puede utilizar el comando de exportación fiesta, ya que estos se pierden también - Capistrano parece poner en marcha un nuevo shell para cada comando (o algo así), y eso se pierde, también:

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 Capistrano: shell y opciones: pty también (y en combinación con los otros enfoques), pero no hay suerte, tampoco.

Entonces, ¿cuál es la forma correcta de hacerlo? Esto parece una tarea tan básica que debería haber una forma realmente simple de lograrlo, pero me he quedado sin ideas. ¿Nadie?

¡Gracias de antemano!

Respuesta

5

yo creo que hay, de hecho, 2 problemas:

1) Usted quiere cambiar la ruta en el host (s) remoto.

Alter/establecer la ruta en su .bashrc en el host remoto (s) y ejecutar cap> printenv, si su camino es correcto, ir a # 2, de lo contrario tratar de añadir a su export BASH_ENV=~/.bashrc/etc/profile (tenga cuidado, ~ /. bashrc correrá entonces para toda la cáscara no interactivo para todos los usuarios)

2) ¿quieres sudo para mantener su PATH

Run visudo en el host remoto (s) y añadir:

Defaults  exempt_group = "<your_user>" 
+0

Buena llamada: no sabía que sudo oscurecía el entorno local. Parece que simplemente agregar la opción -E corrige la mayoría de los casos, pero $ PATH es especial ([referencia] (http://stackoverflow.com/questions/257616/sudo-changes-path-why)). Voy a jugar con esto un poco más y me pondré en contacto contigo. ¡Aclamaciones! –

9

Si necesita establecer una variable en el host remoto que no sea PATH, debe saber que sshd solo permite ciertas variables de entorno /etc/profile o ~/.bashrc de manera predeterminada, por razones de seguridad. Como dijo Lou, puede hacer cap shell y usar el comando cap> printenv, o puede hacer cap COMMAND=printenv invoke en un comando.

Si aparece la variable al ssh en el shell remoto normalmente, pero que no se ve en el comando cap printenv, aquí es una solución:

  1. Conjunto PermitUserEnvironment yes en el archivo del servidor remoto /etc/ssh/sshd_config, y reiniciar sshd
  2. Editar el archivo ~/.ssh/environment para el usuario remoto que está en ssh'ing como, y poner su variable (s) allí como VARIABLE=value

Ahora esos deben presentarse cuando lo haces cap COMMAND=printenv invoke

+0

Esto podría funcionar, pero requiere cambios de configuración de privilegios de raíz. Ver mi respuesta –

3

Necesitaba establecer una variable de entorno para que una tarea específica funcione. El comando "Ejecutar" le permite pasar opciones que incluyen: env:

run "cmd", :env => { 'name' => 'value' } 

En mi caso, quería añadir la variable de entorno a una tarea que no he escrito, por lo que utiliza default_run_options que se utiliza por todas las invocaciones de ejecutar. I añadido esto a la parte superior de mi Capfile:

default_run_options[:env] = { 'name' => 'value' } 
+0

He visto esta solución en otro lugar, pero no puedo hacer que funcione para mí. Obtengo un 'NameError: variable local indefinida o método' default_run_options 'para el error principal: Object'. Puse esa declaración de asignación en la parte superior de mi 'Capfile', antes del primer bloque' namespace: deploy do'. ¿Qué podría estar haciendo diferente? – sameers

+0

¿Cómo está ejecutando la tarea? Si ejecuta la tarea de límite, debe definir default_run_options durante el proceso de carga para que esté disponible para cuando llegue a su Capfile. Incluso con un Capfile de una sola línea que solo dice default_run_options [: x] = {'y' => 'z'}, puedo ejecutar el shell cap. –

46

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.

+0

hmmm, no funciona para mí, vea http://stackoverflow.com/questions/16889642/capistrano-environment-variable?lq=1 – juanpastas

+19

En Capistrano 3 es 'set: default_env, {...}' – Confusion

+1

pregunta estúpida, pero Estoy intentando lo mismo y no está funcionando. De todos modos para depurarlo? – codenoob

0

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 de un archivo .env en la raíz de mi proyecto.

Las instrucciones en su Github repo son bastante sencillas. Agregué el Dotenv.load a mi config/application.rb

Cuestiones relacionadas