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 部署时仅在特定层中的第一个实例上运行命令?
如何在 OpsWorks 部署到 Rails 堆栈期间始终运行迁移