【问题标题】:Capistrano 3 Role specific tasksCapistrano 3 角色特定任务
【发布时间】:2016-11-08 22:47:21
【问题描述】:

我最近从 Capistrano 2 切换到 Capistrano 3,发生了很多变化,我在尝试使新 Capistrano 适应我正在从事的项目中使用 Capistrano 2 所做的工作时遇到了一些麻烦.

我目前面临的最大问题是按角色过滤。我知道你可以做到:

ROLES=web,worker cap production deploy

但如果你有一个包含所有角色的服务器,那似乎真的什么都不做。

使用 Capistrano 2 我可以运行:

cap worker deploy

所有工作任务都会被应用。 Capistrano 2 具有在任务中指定的角色,如果未请求该角色,则跳过任务(在大多数情况下)。然而,Capistrano 3 似乎并非如此,过滤器在多服务器环境中非常有用,在这种环境中,每个角色都有特定的服务器。但是,如果服务器共享一个角色或者只有一个角色,那就有点奇怪了。在新的 Capistrano 任务中,似乎检查是否存在具有给定角色的主机,而不是根据角色检查任务是否应该运行。在我看来,ROLES 旨在限制服务器而不是任务。

所以我想知道这在 Capistrano 3 中是否可行。另一种查看方式是将任务分组到一个名称下。我想选择正在执行的任务组。

我可以通过一些修补来实现这一点,我可以检查 ROLES 是否存在并根据它跳过任务,我可以根据角色选择要加载的配方,我可以根据 ROLES var 动态附加任务,或者可能将任务分组到角色命名的文件中,并根据角色等进行动态加载,但也许我缺少一些东西。

有什么想法吗?

【问题讨论】:

    标签: ruby deployment roles capistrano3


    【解决方案1】:

    在我看来,ROLES 旨在限制服务器而不是任务。

    是的,完全正确。在 Capistrano 3 中,任务与角色无关。在一个任务中,可以在匹配某个角色的服务器上执行命令。当您使用 ROLES 进行过滤时,您会限制运行命令的服务器,但不会限制任务本身。

    您可以限制任务的一种方法是定义您自己的高级任务来调用您想要的任务。

    例如:

    # In deploy.rb
    task "worker" do
      invoke "task1"
      invoke "task2"
      # etc.
    end
    

    这定义了一个worker 任务,它依次执行一个特定的任务列表,可以是任何你想要的。然后就可以运行了:

    cap production worker
    

    它将在您的生产服务器上运行所有这些与工作人员相关的任务。

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2013-11-17
      相关资源
      最近更新 更多