Несколько ролей с атрибутами (?) В Capistrano - PullRequest
3 голосов
/ 15 апреля 2010

Как я могу передать атрибуты своим задачам в capistrano?

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

Я думаю, что это будет что-то вроде .... (и массив hosts будет генерироваться динамически после запроса моего балансировщика нагрузки) ...

role :app, 
       [["server_one", {:instanceId => "alice"}], 
        ["server_two", {:instanceId => "bob"}],
        ["server_three", {:instanceId => "charles"}]]

А потом для моих задач ...

before :deploy, :deregister_instance_from_lb
after :deploy, :register_instance_with_lb

task deregister_instance_from_lb
  #TODO - Deregister #{instanceId} from load balancer
end

task register_instance_with_lb
  #TODO - Register #{instanceId} with load balancer
end

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 01 января 2011

Я использую это для перезапуска своих серверов последовательно, а не параллельно.

task :my_task, :roles => :web do
  find_servers_for_task(current_task).each do |server|
    run "[task command here]", :hosts => server.host
  end
end
2 голосов
/ 15 апреля 2010

Джастин, извини, что это невозможно, после открытия пула потоков (сначала run в наборе серверов) нет доступа к свойствам сервера. (поскольку код run запускается не для каждого сервера, а для сопоставления в пуле). Некоторые люди добились определенных успехов, выполнив что-то подобное, но на самом деле это признак того, что вашим сценариям нужно слишком много информации, которую вы сможете извлечь из производственной среды.

Поскольку в этом случае кажется, что вы делаете что-то вроде использования имени хоста для передачи в сценарий, используйте то, что дает вам Unix:

run "./my_script.rb `hostname`"

Это сработает?

Ссылки:

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html (раздел 3.4.5)

http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname (или имя хоста $ man (1))

1 голос
/ 01 мая 2010

Никто не знает? Я нашел кое-что о последовательном блоке ниже, но это насколько я понял ...

find_servers.each do |server|
  #TODO - remove from load balancer
  #TODO - deploy
  #TODO - add back to load balancer
end

Мне трудно поверить, что никому никогда не приходилось выполнять последовательные задачи с помощью cap.

...