【问题标题】:LWRP compile and converge phaseLWRP 编译和收敛阶段
【发布时间】:2016-04-23 16:54:17
【问题描述】:

我们发现 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)

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

提前致谢!

【问题讨论】:

  • 有具体的例子吗?

标签: ruby chef-infra lwrp


【解决方案1】:

你对所发生的事情过于概括了。

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

执行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 提供程序操作视为在它自己的主厨客户端运行中运行的食谱。

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

【讨论】:

  • 非常感谢您的回答。这对我很有帮助。我已经认为这一定是这样的,但我没有找到任何关于这种行为的明确文档,我认为你知道这一点非常重要。它在某处有记录吗?再次,非常感谢!
  • @JohannesKleinlercher 记录了 here 用于厨师客户端运行、编译和收敛阶段。而here 第二段说提供者的内容将在收敛时间运行。简而言之,自定义资源与普通资源没有什么不同,实际上您的行为与 ruby​​_block 相同。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多