【问题标题】:Deep diving into timing manipulation of Chef resources深入研究 Chef 资源的时序操作
【发布时间】:2016-02-10 14:21:52
【问题描述】:

这是试图更多地了解厨师资源集合的工作原理,更重要的是如何使用 ruby​​ 代码操作它。

Chef 有两个阶段,编译和执行阶段。在编译阶段,所有调用资源的东西都会获得自己的资源集合,然后按顺序执行。用于控制集合中的位置的内置方法是 :delayed、:immediately、:notifies 和 :subscribes。

延迟的资源将被放置在其资源集合的末尾,立即按顺序放置,通知将被通知的资源放置在通知资源之后,订阅的资源将放置在其订阅的资源之后。

问题的核心是我们如何才能覆盖此行为以将资源放置在最初不属于所谓的资源的资源集合中。

换句话说,如果配方 foo 调用包含资源 oof 的资源栏,我们如何将资源 oof 放置到配方 foo 的资源集合中。

我不希望这个问题有一个简单的答案,而且面包屑对我来说是完全可以接受的。

【问题讨论】:

  • 抱歉没有帮助的评论,但我会将其移至 serverfault。
  • 我不同意,这完全是关于代码的。
  • 在您的示例中,bar 资源在运行时声明 oof,对吗?所以oof 可能在资源集合中,但直到 bar 的操作实际运行。您是否尝试过在编译时运行 bar 资源的操作?否则,如果您尝试在配方foo 中引用资源,您可能会不走运——因为当foo 配方正在运行时,该资源还不存在。我建议您参考@StephenKing 的答案,因为它确实是您正在寻找的面包屑。

标签: ruby chef-infra


【解决方案1】:

你对它的工作原理有一些误解。

  1. 在编译阶段,对配方进行评估,运行它们的 ruby​​ 代码,并按照资源出现的顺序构建资源集合。
  2. 在收敛时,厨师迭代资源集合,调用此资源的操作代码。
  3. 如果资源被更新并且有通知或订阅,那么有2个选项(我只会谈论通知,subscire只是目标的挂件)
    • :immediately -> notify 中给定的 action 方法被立即调用
    • :delayed -> 动作排队等待在运行结束时执行。

请注意,对于 3. 在收敛 pgase 期间资源集合永远不会更改,创建了一个单独的队列以在运行结束时运行 :delayed 通知。


换句话说,如果配方 foo 调用资源栏,其中包括 资源 oof 我们如何将资源 oof 放到资源上 食谱 foo 的集合。

如果我正确理解您的意思,您希望 LWRP 的内部资源显示在运行资源集合中。

LWRP 发生的情况是 LWRP 资源在编译时被添加到运行的资源集合中。一旦在收敛时间并在此 LWRP 的调用下,将启动一个“内部”厨师,它将评估提供程序代码作为一个配方,此内部运行不知道父资源集合中有什么,因此您无法通知里面的外部资源。

此行为由use_inline_resource 参数控制。

自从 chef 12.5 新的 custom_resource 模型改变了 LWRP 的完成方式并旨在简化他们的写作,旧的语法被宣布被弃用。

在你的 LWRP 中禁用 use_inline_resource 听起来是个坏主意,你真正想要达到什么目的?我感觉你问的是一个 XY 问题,它的解决方法可能与你的实际想法不同。

【讨论】:

  • 感谢您的回答。在这个特定的实例中,我试图添加一个将在整个运行结束时运行的重启资源。显然,解决方法是在配方中调用需要重新启动的资源时,在配方上下文中延迟通知重新启动资源。我更大的目标是更好地了解您提供帮助的资源时间安排。
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多