Создание задачи Capistrano, которая выполняет различные задачи в зависимости от роли - PullRequest
17 голосов
/ 16 апреля 2009

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

Ответы [ 6 ]

17 голосов
/ 16 апреля 2009

Стандартный способ сделать это в 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

Так что да, вам нужно написать отдельные задачи, но вы можете вызывать их из родительской задачи, и они будут фильтроваться соответствующим образом.

5 голосов
/ 20 июня 2011

На самом деле нет:

% 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

Параметр: role передается для запуска команды и т. Д., Но, похоже, не влияет на фактическое выполнение задачи.

Извините, я не нашел способ добавить комментарий к комментарию, поэтому я написал его здесь.

3 голосов
/ 18 апреля 2012

Вы также можете сделать

task :foo do
    run "command", :roles => :some_role
    upload "source", "destination", :roles => :another_role
end
2 голосов
/ 06 июля 2012

Использовать пространство имен: 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
1 голос
/ 12 февраля 2014

Только для записи, это может быть решением с использованием 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".

1 голос
/ 17 марта 2012

Есть способ, вид. Проверьте: 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.

Я не проверял, что это работает внутри скрипта ruby, обновляя хэш ENV, но это хорошее начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...