0

我有一个通过运行厨师食谱来配置 VM 的 Vagrantfile。厨师食谱中的第一个资源是:

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 盒子在工作和家里都是一样的。我是一名厨师新手,所以对于我的食谱中资源的运行顺序,我可能有一些不明白的地方?我希望它们按顺序运行...

我还尝试notifies在块内调用directory,在这里我调用另一个execute:immediately。那行得通,但是在第二个执行块中,我测试了是否/downloads已创建并且尚未创建。

显然我错过了一些非常基本的东西。

4

1 回答 1

3

Chef 有两个执行阶段:编译阶段和收敛阶段。

在编译阶段,您编写的任何资源声明(如directory)都会被编译但不会被执行。您编写的任何裸 Ruby 代码此时也会执行。在收敛阶段,任何已编译的资源然后在测试和设置操作中收敛。

我将假设在工作中,您已经有一个/downloads预先存在的目录,因此该资源在收敛期间是无操作的,并且在编译期间不会发生提升。

如果您希望任意 Ruby 代码在收敛时执行,请将其放入ruby_block资源中。

于 2014-06-12T04:50:31.740 回答