Chef infra 厨师食谱中是否有一系列的步骤

Chef infra 厨师食谱中是否有一系列的步骤,chef-infra,chef-recipe,cookbook,Chef Infra,Chef Recipe,Cookbook,在我的食谱中,我添加了以下内容: directory '/opt/test/scripts' do owner 'root' group 'root' mode '0755' action :create recursive true not_if 'grep /opt/test' end 下载文件并更改权限: 这看起来很奇怪,因为它试图下载文件,而不是创建一个需要下载文件的目录 它尝试将文件下载到/opt目录,由于该目录不可用,因此执行过程将失

在我的食谱中,我添加了以下内容:

directory '/opt/test/scripts' do
    owner 'root'
    group 'root'
    mode '0755'
    action :create
    recursive true
    not_if 'grep /opt/test'
end
下载文件并更改权限: 这看起来很奇怪,因为它试图下载文件,而不是创建一个需要下载文件的目录

它尝试将文件下载到/opt目录,由于该目录不可用,因此执行过程将失败

观察到的错误 /var/chef/cache/cookbooks/ill/recipes/default.rb中的配方编译错误 Errno::Enoint 没有这样的文件或目录@rb_sysopen-/opt/test/scripts/pair.sh

是否有CHEF实现的控制机制,或者是否有方法让CHEF了解目录创建应该首先进行,然后再下载


谢谢

Chef使用了一个在中详细介绍的双过程执行模型,但基本上首先运行作为配方的Ruby代码,该代码“编译”到资源,然后对资源进行评估。因此,将资源DSL和普通Ruby混合在一起意味着它们不会按照您期望的顺序执行(因为
目录
资源只是排队,而不是实际运行)。也就是说,您希望在这里使用
remote\u文件
资源,而不是手动代码,不过在更一般的情况下,您可以使用
ruby\u块
资源延迟运行一些代码,直到收敛时间。

谢谢coderanger,当您说使用remote\u文件时,你能解释一下是下载文件还是创建新目录吗???
uri=URI.parse('https://repo.test2.io/BwIaTHE0ohsUts74LYZMzrt/pair.sh')
response = Net::HTTP.get_response(uri)
File.write('/opt/test/scripts/pair.sh', response.body)
File = File.new( "/opt/test/scripts/pair.sh", "w" ).chmod( 0755 )