Роли Capistrano и проблема / ошибка хоста? - PullRequest
1 голос
/ 14 апреля 2011

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

role :test1, "earzur@beta-app-01"
role :test2, "earzur@beta-app-02"


task :full_test, :roles => [:test1,:test2] do
  log_test1
  log_test2
end

task :log_test1, :roles => :test1 do
  logger.info "TEST1 !!!"
  run "echo `hostname`"
end

task :log_test2, :roles => :test2 do
    logger.info "TEST2 !!!"
    run "echo `hostname`"
end

Когда я пытаюсь выполнить с ограничением роли, используя ROLES =: test1, log_test2 все еще выполняется на том же хосте, который не объявлен как часть роли: test2! Это ожидаемое поведение Капистрано? Если это ожидается, есть ли способ предотвратить это?

ROLES=test1 cap full_test
  * executing `full_test'
  * executing `log_test1'
 ** TEST1 !!!
  * executing "echo `hostname`"
    servers: ["beta-app-01"]
    [earzur@beta-app-01] executing command
 ** [out :: earzur@beta-app-01] ec2-*****.compute-1.amazonaws.com
    command finished in 350ms
  * executing `log_test2' <<<< shouldn't that be filtered ? because of :roles => :test2 ?
 ** TEST2 !!!
  * executing "echo `hostname`" 
    servers: ["beta-app-01"]
    [earzur@beta-app-01] executing command
 ** [out :: earzur@beta-app-01] ec2-*****.compute-1.amazonaws.com
    command finished in 410ms

Заранее спасибо, соответствующие записи (/642679/sozdanie-zadachi-capistrano-kotoraya-vypolnyaet-razlichnye-zadachi-v-zavisimosti-ot-roli) я не могу найти, кажется, не охватывают эту проблему ...

1 Ответ

1 голос
/ 26 апреля 2011

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

Чтобы это исправить, просто создайте метод xtask и замените все ваши вызовы task следующим:

# Tasks are executed even on servers which do not have the right role
# see http://www.mail-archive.com/capistrano@googlegroups.com/msg01312.html
def xtask(name, options={}, &block)
  task(name, options) do
    if find_servers_for_task(current_task).empty?
      logger.info '... NOT on this role!'
    else
      block.call
    end
  end
end

Кроме того, не определяйте этот метод в случайном месте, как в начале в вашем Capfile . Это должно быть определено в файле, присутствующем в пути загрузки (кто знает почему). Например, напишите метод xtask в новом файле helpers / role.rb и добавьте его в Capfile :

# Add the current directory to the load path, it's mandatory
# to load the helpers (especially the +xtask+ method)
$:.unshift File.expand_path(File.dirname(__FILE__))
require 'helpers/roles'

Если вы этого не сделаете, cap -T покажет, что все задачи, определенные с помощью xtask , не будут иметь пространства имен, поэтому они будут перезаписывать друг друга, если они имеют одинаковые имена в разных пространствах имен.

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