OpsWorks 在部署时运行挂钩

Posted

技术标签:

【中文标题】OpsWorks 在部署时运行挂钩【英文标题】:OpsWorks run hook on deployment 【发布时间】:2015-04-21 06:15:40 【问题描述】:

我正在使用 OpsWorks 进行生产部署,并且我希望有一个在部署成功后运行的通知挂钩(特别是 Slack webhook)。

我可以制作一个配方来执行此操作,但是配方在每个实例上运行,(我认为)会执行 N 个钩子(其中 N 是实例数)。我真的只想在 all 实例完成部署后运行一个钩子。

当应用完成部署到所有 OpsWorks 实例后,有什么方法可以运行代码?

【问题讨论】:

【参考方案1】:

是的! (嗯,有点……)有Chef Deployment Hooks。

在您的情况下,由于您只运行一次,您将必须找到一种方法来“选择”一台服务器并在 after_restart 上运行您的代码或在 hooks 锻炼中以其他方式确保它是它是部署的“最后一个”。

下面是一个例子,它总是告诉你当前实例是否是“领导者”,所以只选择一个实例来运行一些东西:

available_instances = new_resource.node[:opsworks][:layers]['php-app'][:instances]
available_instances = available_instances.select  |name, instance|
  ['requested', 'booting', 'running_setup', 'online'].include?(instance[:status])

leader_name = available_instances.keys.sort.first
leader = new_resource.node[:opsworks][:layers]['php-app'][:instances][leader_name]

if leader && new_resource.node[:opsworks][:instance]
  is_leader = leader[:aws_instance_id] == new_resource.node[:opsworks][:instance][:aws_instance_id]
else
  is_leader = true
end

【讨论】:

以上是关于OpsWorks 在部署时运行挂钩的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 opsworks 部署时仅在特定层中的第一个实例上运行命令?

如何终止 AWS Opsworks 中的部署?

如何在 OpsWorks 部署到 Rails 堆栈期间始终运行迁移

使用 unicorn 将 Rails 应用程序部署到 Opsworks 时出错

OpsWorks / Chef PHP 部署流程

尽管在 Opsworks 中成功部署了 php 应用程序,但仍出现“未找到”错误。其他 php 应用程序运行良好