0

我们发现 LWRP 操作(尤其是库)中的 ruby​​ 代码总是在收敛阶段执行(也没有 ruby​​_block 资源!)。这是预期的行为吗?我们没有找到任何关于此的特定文档,并且知道 ruby​​ 代码通常在编译阶段执行,这让我们有点困惑。我们使用 Chef 12.0.3。

这是一个小例子:

在食谱/default.rb 中:

time = Time.new
puts "Current Time : " + time.inspect

converge_test_my_resource "test_resource" do
  action :install
end

在提供者/my_resource.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)

所以你看到时间戳的第一个打印是在编译阶段,但时间戳的下一个打印是在收敛阶段。

提前致谢!

4

2 回答 2

1

你过度概括了发生的事情。

编译阶段(资源收集阶段)

执行配方代码,将资源添加到资源堆栈。

执行阶段(提供者执行阶段)

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-18T15:16:16.843 回答
0

有关此过程的更具体概述,请参阅https://coderanger.net/two-pass/。在动作块内部,它的行为类似于配方,但具有自己的编译和收敛阶段。

于 2016-01-18T20:11:39.417 回答