OpsWorks在部署时运行挂钩

时间:2015-02-19 18:33:30

标签: ruby-on-rails chef aws-opsworks slack-api

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

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

当应用程序完成部署到所有OpsWorks实例后,有没有办法运行代码?

1 个答案:

答案 0 :(得分:0)

是的! (好吧有点......)有Chef Deployment Hooks

在你的情况下,由于你只运行一次,你必须找到一种方法来“选择”一个服务器并在after_restart或钩子训练中运行你的代码以确保其他方式这就是部署的“最后一个”。

下面是一个示例,它将始终告诉您当前实例是否为“领导者”,因此只选择一个实例来运行某些实例:

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