Я ищу способ вызвать отдельную задачу Capistrano, чтобы выполнять разные вещи для разных ролей. Может ли Capistrano это сделать, или я пишу конкретную задачу для каждой роли?
Создание задачи Capistrano, выполняющей различные задачи на основе роли
Ответ 1
Стандартный способ сделать это в 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
Итак, вам нужно написать отдельные задачи, но вы можете вызвать их из родительской задачи, и они будут соответствующим образом фильтровать.
Ответ 2
На самом деле нет:
% 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
Параметр: params передается далее для запуска команды и т.д., но, похоже, не влияет на то, действительно ли задана задача.
Извините, не нашел способа поместить комментарий к комментарию, поэтому я написал его здесь.
Ответ 3
Вы также можете сделать
task :foo do
run "command", :roles => :some_role
upload "source", "destination", :roles => :another_role
end
Ответ 4
Использовать пространство имен: 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
эти задачи отображаются в cap -T как
backup:default
backup:web
backup:db
Ответ 5
Есть способ, вид. Проверьте 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
назначается одному серверу.
В командной строке я могу запустить:
[[email protected] bin]$ cap echo_hello ROLES=lots_of_servers
И теперь задача будет выполняться в роли lots_of_servers.
Я не проверял, что это работает внутри ruby script, обновив хэш ENV
, но это хороший старт.
Ответ 6
Только для записи это может быть решение с использованием 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
Определение sever для выполнения задачи "do_something" на сервере приложений будет примерно таким:
server 'application.your.domain', user: 'deploy', roles: %w{app_role}
Затем вы можете вызвать задачу (есть несколько способов сделать это), и задача выполнит определенные инструкции в соответствии с "app_role".