如何解决capistrano角色和主机问题/错误?
| Capistrano似乎没有适当地处理角色-至少我是如何理解它们的。我无法使用以下简单的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的一部分的同一主机上执行!这是Capistrano的预期行为吗?如果可以预料,有什么方法可以防止这种情况的发生?
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
预先感谢,我似乎找不到相关条目(http://stackoverflow.com/questions/754015/creating-a-capistrano-task-that-performs-different-tasks-based-on-role)涵盖这个问题...
解决方法
我从来不明白为什么Capistrano会那样做,但是Capistrano的原始维护者Jamis Buck说这必须是这样。
要解决此问题,只需创建一个xtask方法,然后用此方法替换所有任务调用:
# 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开头。必须在加载路径中的文件中定义它(谁知道为什么)。例如,在新的helpers / roles.rb文件中编写xtask方法,并将其添加到您的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\'
如果您不这样做,则大写的-T将显示用xtask定义的所有任务将没有任何名称空间,因此如果它们在不同名称空间中具有相同的名称,它们将相互覆盖。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。