深入探讨Chef资源的计时操作

时间:2015-11-09 20:23:55

标签: ruby chef

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

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

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

问题的关键是我们如何覆盖此行为以将资源放置在不属于首先调用资源的资源集合上。

换句话说,如果recipe foo调用包含资源的资源栏,我们如何将资源oof放在recipe foo的资源集合上。

我不希望对这个问题做出简单的回答,并且面包屑完全可以接受。

1 个答案:

答案 0 :(得分:2)

你对它的运作方式有一些误解。

  1. 在编译阶段,评估配方,运行ruby代码并按资源显示的顺序构建资源集合。
  2. 在收敛时,chef会迭代资源集合,调用此资源的操作代码。
  3. 如果资源被更新并且有通知或订阅,那么有2个选项(我只谈论通知,subscire只是目标的附件)
    • :immediately - >立即调用notify for target中给出的action方法
    • :delayed - >该操作排队等待在运行结束时执行。
  4. 请注意,对于3.在融合pgase期间永远不会更改资源集合,创建了一个单独的队列,以便在运行结束时运行:delayed通知。

      

    换句话说,如果recipe foo调用包含的资源栏   资源如何将资源置于资源上   食谱foo的集合。

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

    LWRP的作用是在编译时将LWRP资源添加到运行的资源集合中。一旦处于收敛时间并且在此LWRP的调用下,将启动“内部”主厨,该主厨将评估提供者代码作为配方,此内部运行不知道父资源集合中的内容,因此您无法通知其中的外部资源。

    此行为由use_inline_resource参数控制。

    由于大厨12.5新的custom_resource模型改变了LWRP的完成方式并且旨在简化他们的写作,因此宣布旧语法被弃用。

    禁用LWRP中的use_inline_resource声音然后是一个坏主意,你真正想要实现的目标是什么?我觉得你要求的XY问题可能与你的实际想法有所不同。