【问题标题】:directory resource does not create directory目录资源不创建目录
【发布时间】:2014-06-12 12:50:31
【问题描述】:

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

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

很明显,我遗漏了一些非常基本的东西。

【问题讨论】:

    标签: resources vagrant chef-infra recipe


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。如何在一个资源声明和另一个资源声明之间传递变量?假设我需要编写 ruby​​ 代码(ruby_block)来查询一些在线资源,这将告诉我要创建的目录的名称(在目录块中)。看起来我可以说 node.default['some_key'] = 'value' 但这有点麻烦。
    • 您可以在 node.run_state 上存储一些东西 - 为此目的,它是一个空散列,用于在运行中传递东西,并在最后被丢弃。
    • 不起作用。查看最小示例:gist.github.com/dtenenba/87097fe75f72a1222f3e 结果为“==> 默认值:[2014-06-12T05:31:24+00:00] 错误:nil 不是 remote_file 的有效 source 参数。source 必须是绝对 URI 或 URI 数组。==> 默认值:[2014-06-12T05:31:24+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)"
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多