LWRP编译收敛阶段

LWRP compile and converge phase

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

这是一个小例子:

在 recipes/default.rb:

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

converge_test_my_resource "test_resource" do
  action :install
end

在 providers/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)

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

提前致谢!

你有 over-generalized 会发生什么。

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

执行recipe代码,将资源添加到资源栈。

Execute Phase(提供者执行阶段)

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 提供程序操作视为食谱 运行ning 在它自己的 chef-client 运行.

这意味着在 LWRP 提供程序之外声明的所有资源都将消失,并且您在这个新上下文中确实拥有一个独立的 运行 主厨。这包括资源收集阶段和提供者执行阶段。当这个内部 chef 运行 完成时,您将丢弃所有这些资源并退出 LWRP 提供程序。

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