我们发现LWRP操作(尤其是库)中的ruby代码总是在聚合阶段执行(也没有ruby_block资源!)。这是预期的行为吗?我们没有找到关于这方面的任何具体文档,并且知道ruby代码通常在编译阶段被执行,这让我们有点困惑。我们用12.0.3大厨。
下面是一个小例子:
在食谱/default.rb中:
time = Time.new
puts "Current Time : " + time.inspect
converge_test_my_resource "test_resource" do
action :install
end在providers/my_resource.rb e.rb中:
action :install do
time = Time.new
puts "Current Time : " + time.inspect
end厨房的产出是:
Compiling Cookbooks...
Current Time : 2016-01-18 16:37:52 +0100
Converging 1 resources
Recipe: converge_test::default
* converge_test_my_resource[test_resource] action install
Current Time : 2016-01-18 16:37:52 +0100
(up to date)因此,您可以看到时间戳的第一个打印是在编译阶段,但是下一个时间戳打印处于聚合阶段。
提前感谢!
发布于 2016-01-18 15:16:16
你对发生的事情过于概括了。
编译阶段(资源收集阶段)
执行配方代码,将资源添加到资源堆栈中。
执行阶段(提供者执行阶段)
For each resource on the resource stack create a provider for that resource execute the provider action code specified in the resource declaration ** next
** LWRP提供者
创建一个新的执行上下文,并将此lwrp提供程序操作视为在其自己的厨师-客户端运行中运行的菜谱。
这意味着,在LWRP提供商之外声明的所有资源都将消失,在这个新的上下文中,您将拥有一个独立的主厨。这包括资源收集阶段和提供者执行阶段。当这个内部主厨运行完成后,您将丢弃所有这些资源并退出LWRP提供程序。
发布于 2016-01-18 20:11:39
有关此过程的更详细概述,请参见https://coderanger.net/two-pass/。在动作块中,它的行为就像一个菜谱,但是有它自己的编译和收敛阶段。
https://stackoverflow.com/questions/34856088
复制相似问题