厨师:食谱中的处理顺序

Chef: Process sequence in a recipe

我的问题是验证我的食谱中的过程。

我的测试是 厨师 12.18.31 Ubuntu 16.04 - AWS EC2 - Opsworks 堆栈

所以,如果我有一个顺序如下的食谱:

Native_Chef_Resource do
Chef::Log.info("First")
My_First_Variable
end

My_Command do
my script based on My_First_Variable
end

My_Resource do
Chef::Log.info("Second")
My_Second_Variable
end

My_Other_Command do
my script based on My_Second_Variable
end

我注意到本地 chef 资源被及时执行以对 My_Command 产生价值,但我在我的食谱中创建的资源不遵守顺序,我没有价值在 My_Other_Command.

带着这个疑问,我尝试了"Notifies"这些食谱和资源。

食谱

test 'test notify' do
par_test 'primo test'
notifies :run, 'execute[bo]', :immediately
end

execute 'bo' do
command 'echo uname -a'
Chef::Log.info("execute bo")
end

资源

resource_name :test
property :par_test
default_action :create
action :create do
Chef::Log.info("#{par_test}")
end

我做了两个测试,一个用'immediately',另一个用'before'。

结果:

立即测试 [2017-10-15T12:54:41+02:00] 信息:执行bo [2017-10-15T12:54:41+02:00] 信息:处理测试[测试通知] 操作创建(部署::test_notify 第 1 行) [2017-10-15T12:54:41+02:00] 信息:初始测试 [2017-10-15T12:54:41+02:00]信息:处理执行[bo]动作运行(部署::test_notify第6行) [2017-10-15T12:54:41+02:00] 信息:执行[bo] 运行 成功

用之前测试

[2017-10-15T13:16:31+02:00] 信息:执行bo [2017-10-15T13:16:31+02:00] INFO: test[test notify] 运行ning why-运行 create action to support before action [2017-10-15T13:16:31+02:00] 信息:处理测试[测试通知] 操作创建(部署::test_notify 第 1 行) [2017-10-15T13:16:31+02:00] 信息:初始测试 [2017-10-15T13:16:31+02:00] 信息:处理测试[测试通知] 操作创建(部署::test_notify 第 1 行) [2017-10-15T13:16:31+02:00] 信息:初始测试 [2017-10-15T13:16:31+02:00] 信息:处理执行 [bo] 操作 运行(部署::test_notify 第 6 行) [2017-10-15T13:16:31+02:00] 信息:执行[bo] 运行 成功

您如何看待执行顺序? 谢谢

我在 https://coderanger.net/two-pass/ 上对此有更详细的描述,但基本上:

食谱中基本级别的任何 Ruby 代码(包括创建资源的所有调用)在编译食谱文件时都是 运行。这包括资源的主 do ... end 块中的任何代码(相对于 ruby_blockblock 属性 或 lazy{} 内的任何内容)作为该块在资源对象的创建过程中 instance_eval'。在编译 运行 列表中的所有配方之后,资源的操作方法在收敛阶段为 运行。自定义资源以递归方式重复此过程,自定义资源的操作方法是它们自己的迷你编译和收敛阶段。