厨师:食谱中的处理顺序
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_block
的 block
属性 或 lazy{}
内的任何内容)作为该块在资源对象的创建过程中 instance_eval
'。在编译 运行 列表中的所有配方之后,资源的操作方法在收敛阶段为 运行。自定义资源以递归方式重复此过程,自定义资源的操作方法是它们自己的迷你编译和收敛阶段。
我的问题是验证我的食谱中的过程。
我的测试是 厨师 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_block
的 block
属性 或 lazy{}
内的任何内容)作为该块在资源对象的创建过程中 instance_eval
'。在编译 运行 列表中的所有配方之后,资源的操作方法在收敛阶段为 运行。自定义资源以递归方式重复此过程,自定义资源的操作方法是它们自己的迷你编译和收敛阶段。