深入研究 Chef 资源的时间操作
Deep diving into timing manipulation of Chef resources
这是为了进一步了解 chef 资源集合的工作原理,更重要的是如何使用 ruby 代码对其进行操作。
Chef 有两个阶段,编译阶段和执行阶段。在编译阶段,所有调用资源的东西都会获得自己的资源集合,然后按顺序执行。用于控制集合中位置的内置方法是 :delayed、:immediately、:notifies 和 :subscribes.
延迟资源将放置在其资源集合的末尾,立即按顺序放置,通知将通知资源放置在通知资源之后,订阅资源将放置在其订阅的资源之后。
问题的核心是我们如何覆盖此行为以将资源放置在不属于最初称为资源的资源集合上。
换句话说,如果recipe foo调用了包含资源oof的resource bar,我们如何将资源oof放到recipe foo的资源集合中。
我不希望这个问题有一个简单的答案,面包屑对我来说是完全可以接受的。
你对它的工作原理有一些误解。
- 在编译阶段,对配方进行评估,ruby 代码是 运行,并按照资源出现的顺序构建资源集合。
- 在收敛时间,chef 迭代资源集合,调用该资源的操作代码。
- 如果一个资源被更新,并且有一个通知或订阅,那么有2个选项(我只说通知,订阅只是目标的挂件)
:immediately
-> notify中给定的action方法立即调用target
:delayed
-> 动作排队等待在 运行 结束时执行。
请注意,对于 3. 资源集合在收敛 pgase 期间永远不会更改,在 运行 末尾创建了一个单独的队列 运行 :delayed
通知。
In other words, if recipe foo calls resource bar which includes
resource oof how can we place resource oof onto the resource
collection of recipe foo.
如果我正确理解您的意思,您希望 LWRP 中的内部资源显示在 运行 资源集合中。
LWRP 的情况是 LWRP 资源在编译时添加到 运行 的资源集合中。一旦进入收敛时间并在该 LWRP 的调用下,将启动一个 'inner' 厨师,它将提供者代码作为食谱进行评估,这个内部 运行 不知道父资源集合中有什么,所以您无法通知其中的外部资源。
此行为由 use_inline_resource
参数控制。
自 chef 12.5 以来,新的 custom_resource
模型改变了 LWRP 的完成方式并旨在简化其编写,宣布弃用旧语法。
在您的 LWRP 中禁用 use_inline_resource
听起来不是个好主意,您真正想要实现的是什么?我感觉你在问一个 XY 问题,它的解决方式可能与你的实际想法不同。
这是为了进一步了解 chef 资源集合的工作原理,更重要的是如何使用 ruby 代码对其进行操作。
Chef 有两个阶段,编译阶段和执行阶段。在编译阶段,所有调用资源的东西都会获得自己的资源集合,然后按顺序执行。用于控制集合中位置的内置方法是 :delayed、:immediately、:notifies 和 :subscribes.
延迟资源将放置在其资源集合的末尾,立即按顺序放置,通知将通知资源放置在通知资源之后,订阅资源将放置在其订阅的资源之后。
问题的核心是我们如何覆盖此行为以将资源放置在不属于最初称为资源的资源集合上。
换句话说,如果recipe foo调用了包含资源oof的resource bar,我们如何将资源oof放到recipe foo的资源集合中。
我不希望这个问题有一个简单的答案,面包屑对我来说是完全可以接受的。
你对它的工作原理有一些误解。
- 在编译阶段,对配方进行评估,ruby 代码是 运行,并按照资源出现的顺序构建资源集合。
- 在收敛时间,chef 迭代资源集合,调用该资源的操作代码。
- 如果一个资源被更新,并且有一个通知或订阅,那么有2个选项(我只说通知,订阅只是目标的挂件)
:immediately
-> notify中给定的action方法立即调用target:delayed
-> 动作排队等待在 运行 结束时执行。
请注意,对于 3. 资源集合在收敛 pgase 期间永远不会更改,在 运行 末尾创建了一个单独的队列 运行 :delayed
通知。
In other words, if recipe foo calls resource bar which includes resource oof how can we place resource oof onto the resource collection of recipe foo.
如果我正确理解您的意思,您希望 LWRP 中的内部资源显示在 运行 资源集合中。
LWRP 的情况是 LWRP 资源在编译时添加到 运行 的资源集合中。一旦进入收敛时间并在该 LWRP 的调用下,将启动一个 'inner' 厨师,它将提供者代码作为食谱进行评估,这个内部 运行 不知道父资源集合中有什么,所以您无法通知其中的外部资源。
此行为由 use_inline_resource
参数控制。
自 chef 12.5 以来,新的 custom_resource
模型改变了 LWRP 的完成方式并旨在简化其编写,宣布弃用旧语法。
在您的 LWRP 中禁用 use_inline_resource
听起来不是个好主意,您真正想要实现的是什么?我感觉你在问一个 XY 问题,它的解决方式可能与你的实际想法不同。