我有一个Vagrantfile,通过运行一个厨师配方来配置VM。厨师食谱中的第一个资源是:
directory "/downloads" do
owner "root"
group "root"
mode "0755"
action :create
end
# check that it worked:
raise "/downloads doesn't exist!" unless File.exists? "/downloads"
当我在工作中运行它时,它运行正常。
当我在家里运行它时,它会失败,当我检查/downloads
是否存在时会引发异常。
我不确定为什么会这样。我希望它的行为相同,因为底层的Vagrant盒子在工作和家里都是一样的。我是一名厨师newb所以也许有些事情我不了解资源在我的食谱中运行的顺序?我希望它们按顺序运行......
我还尝试在notifies
块中添加directory
个调用,我在其中调用另一个execute
块:immediately
。这是有效的,但在第二个执行块中,我测试是否已经创建了/downloads
而它没有。
显然我遗漏了一些非常基本的东西。
答案 0 :(得分:3)
Chef有两个执行阶段:编译阶段和收敛阶段。
在编译阶段,您编写的任何资源声明(如directory
)都已编译但未执行。您编写的任何裸Ruby代码也会在此时执行。在收敛阶段,任何编译的资源然后在测试和设置操作中收敛。
我将假设在工作中,您已经预先存在/downloads
目录,因此在汇聚期间资源是无操作,并且在编译期间不会发生提升。
如果您希望任意Ruby代码在收敛时执行,请将其放在ruby_block
资源中。