我正在寻找一种方法来调用单个Capistrano任务来执行不同角色的不同操作。 Capistrano能够做到这一点,还是我为每个角色编写了一个特定的任务?
答案 0 :(得分:17)
在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
所以是的,你确实需要编写单独的任务,但你可以从父任务中调用它们,它们会适当地过滤。
答案 1 :(得分:5)
实际上没有:
% 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
:roles param进一步传递给run命令等,但似乎并不影响该任务是否实际被触发。
抱歉,没有找到评论评论的方式,所以我在这里写了。
答案 2 :(得分:3)
您也可以
task :foo do
run "command", :roles => :some_role
upload "source", "destination", :roles => :another_role
end
答案 3 :(得分:2)
使用命名空间: 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
这些任务显示在上限-T
中backup:default
backup:web
backup:db
答案 4 :(得分:1)
有一种方式,有点。检查:http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/,您将看到可以使用ROLES环境变量覆盖默认角色。
我的任务定义为:
desc "A simple test to show we can ssh into all servers"
task :echo_hello, :roles => :test do
run "echo 'hello, world!'"
end
:test
角色已分配给一台服务器。
在命令行上,我可以运行:
[james@fluffyninja bin]$ cap echo_hello ROLES=lots_of_servers
此任务现在将在lots_of_servers角色上运行。
我没有通过更新ENV
哈希来验证这是否适用于ruby脚本,但这是一个好的开始。
答案 5 :(得分:1)
仅限于记录,这可能是使用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
在应用程序服务器中执行“do_something”任务的服务器定义类似于:
server 'application.your.domain', user: 'deploy', roles: %w{app_role}
然后你可以调用任务(有几种方法可以执行),任务将根据“app_role”执行特定的指令。