【问题标题】:Opsworks - after_restart deploy hook code conditional on layerOpsworks - after_restart 以层为条件部署挂钩代码
【发布时间】:2014-08-12 13:17:58
【问题描述】:

我在 after_restart.rb 中有代码,只有在 rails-app 层中发生重启时我才想运行该代码。我也有一个延迟作业自定义层,如果应用程序在延迟作业层上重新启动,则此代码不应运行。两个层都在同一个实例上。我尝试了使用node[:opsworks][:instance][:layers] 的建议,但由于它是同一个实例,我得到["rails-app", "utillayer"] 用于两个部署(同样,两个部署都在同一个实例上,一个用于rails-app,另一个用于名为utillayer 的延迟作业)

我希望有一种方法可以确定部署发生在哪一层,并将其与 if 语句联系起来,以在“rails app”层中重新启动时运行代码

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: ruby-on-rails amazon-web-services chef-infra aws-opsworks


    【解决方案1】:

    您所追求的特定节点 json 是:node[:opsworks][:instance][:layers]

    node_layers = node[:opsworks][:instance][:layers]
    ## layer must belong to either rails-app OR custom
    if (node_layers.include?("rails-app") || node_layers.include?("custom"))
      // do stuff
    end
    
    ## layer must belong to alteast rails-app 
    if (node_layers.include?("rails-app") 
      // do stuff
    end
    
    ## layer must belong to BOTH layer 
    if  node_layers.include?("rails-app") &&  node_layers.include?("workers") 
      // do stuff
    end
    

    【讨论】:

    • 如果每一层都在一个专用实例中,这将非常有用。我面临挑战的用例是它是一个实例,分为两层,例如它运行 rails-app 和 utillayer(延迟作业)。所以部署在这个实例上发生了两次,rails 被重启了两次, after_restart 被调用了两次。我希望能够根据重新启动的轨道层运行不同的代码。因此,如果图层位于单独的实例上,您的解决方案将是完美的……如果图层位于同一实例上,您很想听听您的想法。
    • 如果您使用他们的层代码,AWS 的标准配方将运行。除非您使用自己的基础设施代码,否则您无法阻止这种情况。我会添加一些变体供您结帐:)
    • Imran,感谢您的回答和更新...仍然没有运气... after_restarts 都报告 node_layers 为 ["rails-app", "utillayer"] 所以没有条件逻辑我可以用来让它做我正在做的事情......
    • 你可以试试:chef-rewind。这有一个方便的功能:UNWIND github.com/bryanwb/chef-rewind .
    猜你喜欢
    • 2014-11-18
    • 2015-04-21
    • 2016-09-24
    • 2016-05-22
    • 2013-08-07
    • 1970-01-01
    • 2012-11-13
    • 2015-02-21
    • 2019-08-10
    相关资源
    最近更新 更多