2009-01-09 10 views
53

Tengo un sistema en producción que tiene varios servidores en varios roles. Me gustaría probar un nuevo servidor de aplicaciones mediante la implementación en ese servidor específico, sin tener que volver a implementarlo en todos los servidores en producción. ¿Hay alguna manera de pedirle a Capistrano que se despliegue en un servidor específico? Idealmente me gustaría ser capaz de ejecutar algo así comoCómo implementar en un solo servidor específico usando Capistrano

cap SERVER=app2.example.com ROLE=app production deploy 

si sólo quería implementar en app2.example.com.

Gracias!

[Actualización] Probé la solución sugerida por Wulong ejecutando:

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

pero Capistrano parecía estar tratando de ejecutar tareas para otros papeles en ese servidor, además de las tareas de aplicaciones. Tal vez necesito actualizar mi versión de cap (estoy ejecutando v2.2.0)?

Respuesta

122

terminé de publicar una pregunta en la lista de usuarios Capistrano here, y obtuvo la siguiente respuesta de Jamis (editado un poco por mí aquí para mayor claridad):


Trate HOSTS variable de entorno:

cap HOSTS=app2.example.com production deploy 

Tenga en cuenta que haciendo esto tratará app2 como en todos los papeles , no sólo lo que el papel (s) pasa a ser declarado en.

Si lo que quieres es hacer un despliegue regular, pero sólo actuar sobre app2 y sólo como app2 se declara en el archivo de receta, puede usar el HOSTFILTER variable en lugar:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Considere este ejemplo concreto. Suponga que el script define tres servidores, A, B, y C. Y define una tarea, "foo", que (por defecto) quiere ejecutar en A y B, pero no C. De esta manera:

role :app, "A", "B" 
role :web, "C" 

task :foo, :roles => :app do 
    run "echo hello" 
end 

Ahora, si lo hace cap foo, se ejecutará el comando de eco en ambos a y B.

Si lo hace cap HOSTS=C foo, se ejecutará el comando echo en C, independientemente del: parámetro de papeles a la tarea .

Si hace cap HOSTFILTER=C foo, no ejecutará el comando echo en all, porque la intersección de (A B) y (C) es un conjunto vacío.(Hay hay hosts en la lista de hosts de foo que responden a C.)

Si lo hace cap HOSTFILTER=A foo, se ejecutará el comando echo sólo en A, debido a que (A B) se cruzó con (A) es (A).

Por último, si lo hace cap HOSTFILTER=A,B,C foo, se ejecutará el comando echo en A y B (pero no C), porque (A B) se cruzó con (B C) es (A B).

En resumen: HOSTS reemplaza por completo la declaración de hosts o roles de la tarea y obliga a que todo se ejecute contra el host especificado. El HOSTFILTER, por otro lado, simplemente filtra los hosts existentes en la lista dada, seleccionando solo aquellos servidores que ya están en la lista de servidores de tareas.

+0

Parece que esto ya no funciona con Capistrano 3.4 – collimarco

+0

En Capistrano 3, usará la variable de entorno HOSTS para lo que HOSTFILTER está en Capistrano 2. http://capistranorb.com/documentation/advanced-features/host-filtering / – codener

1

Usted debe ser capaz de hacer algo como esto en deploy.rb:

task :production do 
    if ENV['SERVER'] && ENV['ROLE'] 
    role ENV['ROLE'], ENV['SERVER'] 
    else 
    # your full config 
    end 
end 
3

El siguiente debe funcionar fuera de la caja:

cap HOSTS=app2.example.com ROLE=app deploy 

Si desea desplegar a> 1 servidor con la misma función:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy 
+1

He probado el primer caso (el despliegue de un único servidor de aplicaciones) mediante la ejecución de HOSTS cap = app2.server .hostname ROLE = aplicación qa deploy pero capistrano parecía tratar de ejecutar tareas para otros roles en ese servidor además de las tareas de la aplicación. Tal vez deba actualizar mi versión de límite (estoy ejecutando 2.2.0). –

+0

HOSTFILTER es la respuesta, esto no es lo que quieres. –

1

Tengo un problema similar e intenté lo siguiente. Funciona:

cap production ROLES=web HOSTS=machine1 stats 
0

También puede specifiy anfitriones a nivel de tarea de parámetro de esta manera:

task :ship_artifacts, :hosts => ENV['DEST_HOST'] do 

end 
Cuestiones relacionadas