Подтвердить что ты не робот

Создание задачи Capistrano, выполняющей различные задачи на основе роли

Я ищу способ вызвать отдельную задачу Capistrano, чтобы выполнять разные вещи для разных ролей. Может ли Capistrano это сделать, или я пишу конкретную задачу для каждой роли?

4b9b3361

Ответ 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

Ответ 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".