在厨师食谱中是否遵循一系列步骤

时间:2018-04-09 14:31:16

标签: chef chef-recipe cookbook

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

directory '/opt/test/scripts' do
    owner 'root'
    group 'root'
    mode '0755'
    action :create
    recursive true
    not_if 'grep /opt/test'
end

下载文件并更改权限:

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 )

看起来很奇怪,因为它试图下载文件而不是创建一个需要下载文件的目录。

尝试将文件下载到/ opt目录,由于目录不可用,它只是无法执行...

错误观察

/var/chef/cache/cookbooks/ill/recipes/default.rb中的配方编译错误

变量Errno :: ENOENT

没有这样的文件或目录@ rb_sysopen - /opt/test/scripts/pair.sh

是否有CHEF实现的控制机制或是否有办法让CHEF理解首先应该发生的目录创建然后下载?

谢谢

1 个答案:

答案 0 :(得分:1)

Chef使用https://coderanger.net/two-pass/中详述的两遍执行模型,但基本上首先运行作为配方的Ruby代码,将其“编译”到资源,然后评估资源。因此,将资源DSL和普通Ruby混合在一起意味着它们不会按照您期望的顺序执行(因为directory资源只排队,而不是实际运行)。也就是说,你想要的是使用remote_file资源而不是手动代码,但在更一般的情况下,你可以使用ruby_block资源来延迟运行一些代码,直到收敛时间。