ruby - rails - Creación de una tarea de Capistrano que realiza diferentes tareas según el rol
capistrano vs jenkins (6)
Estoy buscando una manera de llamar a una sola tarea de Capistrano para realizar diferentes tareas en diferentes roles. ¿Capistrano puede hacer esto o tengo que escribir una tarea específica para cada rol?
En realidad no:
% cat capfile
server ''localhost'', :role2
task :task1, :roles=>:role1 do
puts ''task1''
end
task :task2 do
task1
end
% cap task2
* executing `task2''
* executing `task1''
task1
El: roles param se pasa más allá para ejecutar el comando, etc., pero no parece afectar la ejecución de la tarea.
Lo sentimos, no encontré la forma de poner un comentario en un comentario, así que lo he escrito aquí.
Hay una manera, una especie de Consulte: http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/ y verá que puede anular los roles predeterminados usando la variable de entorno ROLES.
Tengo una tarea definida como:
desc "A simple test to show we can ssh into all servers"
task :echo_hello, :roles => :test do
run "echo ''hello, world!''"
end
El rol de :test
se asigna a un servidor.
En la línea de comandos, puedo ejecutar:
[james@fluffyninja bin]$ cap echo_hello ROLES=lots_of_servers
Y la tarea ahora se ejecutará en el rol lots_of_servers.
No he verificado que esto funcione dentro de un script ruby actualizando el hash ENV
, pero este es un buen comienzo.
La forma estándar de hacer esto en Capistrano:
task :whatever, :roles => [:x, :y, :z] do
x_tasks
y_tasks
z_tasks
end
task :x_tasks, :roles => :x do
#...
end
task :y_tasks, :roles => :y do
#...
end
task :z_tasks, :roles => :z do
#...
end
Entonces sí, necesita escribir tareas separadas, pero puede llamarlas desde una tarea principal y se filtrarán adecuadamente.
Solo para el registro, esta podría ser una solución usando Capistrano 3:
desc "Do something specific for 3 different servers with 3 different roles"
task :do_something do
on roles(:api_role), in: :sequence do
# do something in api server
end
on roles(:app_role), in: :sequence do
# do something in application server
end
on roles(:another_role), in: :sequence do
# do something in another server
end
end
La definición del servidor para realizar la tarea "do_something" en un servidor de aplicaciones sería algo como:
server ''application.your.domain'', user: ''deploy'', roles: %w{app_role}
Luego puede llamar a la tarea (hay varias formas de hacerlo) y la tarea ejecutará instrucciones específicas de acuerdo con el "app_role".
Tambien puedes hacer
task :foo do
run "command", :roles => :some_role
upload "source", "destination", :roles => :another_role
end
Use namespacing: https://github.com/leehambley/capistrano-handbook/blob/master/index.markdown#namespacing-tasks
namespace :backup do
task :default do
web
db
end
task :web, :roles => :web do
puts "Backing Up Web Server"
end
task :db, :roles => :db do
puts "Backing Up DB Server"
end
end
estas tareas se muestran en un límite -T como
backup:default
backup:web
backup:db