2009-11-02 8 views
19

Actualmente estoy configurando un nuevo entorno de producción para una aplicación Rails que incluye múltiples servidores de aplicaciones con carga balanceada (actualmente solo dos, pero esto aumentará con el tiempo).Uso de Capistrano para implementar una aplicación Rails en múltiples servidores web

Me gustaría gestionar la implementación de la aplicación en todos estos servidores en un solo comando utilizando Capistrano (que ya uso para mi único servidor existente). La única forma que puedo ver de hacer esto es usar capistrano-ext (que de hecho ya uso para implementar en mis entornos de prueba y estadificación), definiendo un nuevo 'entorno' para cada servidor de aplicaciones (app1, app2 y así sucesivamente) y realizando una implementación usando algo como:

cap app1 app2 app3 deploy 

es esta la forma recomendada de hacerlo o hay un mejor enfoque?

Respuesta

9

Sí. Capistrano administra múltiples servidores de forma nativa. No hay necesidad de capistrano ext.
Sólo es necesario definir múltiples roles

role :app, "myserver.example.com" 
role :db, "mysecondserver.example.com" 

Por defecto sus tareas serán ejecutadas en cada servidor. Pero puede limitar una tarea a uno o algunos servidores solamente.

task :migrate, :roles => [:app, :db] do 
    # ... 
end 

Aquí, la tarea se ejecutará solo en los roles de aplicación y db.

Puede hacer lo mismo con el método de ejecución.

run "rake db:migrate", :roles => :db 

El rake db: migrate se ejecutará solo en el servidor de db.

+8

Nota sobre la configuración anterior. Múltiples servidores de aplicaciones se verían así: rol: aplicación, "app1.example.com", "app2.example.com", "app3.example.com" – scottd

+3

Esta no es la respuesta correcta basada en la pregunta – Rob

36

Suponiendo capistrano multistage:

En config/deploy/production:

role :app, "server1", "server2", "server3" 

Ahora, un cap deploy production se desplegará en los 3 servidores.

+0

qué hacer ¿Lo hago si quiero múltiples servidores utilizando el entorno de producción, pero todavía ser capaz de implementar en un servidor específico? Dado su ejemplo: simplemente implemente en "servidor1", pero teniendo solo production.rb, ¿es esto posible? – farukg

2

Esto es lo que he tratado en rails 4:

config/deploy.rb:

role :app, %w{server1 server2 server3} 
+0

Esto funcionó para mí con Rails 4. –

Cuestiones relacionadas