【问题标题】:Is there a sequence of steps followed in chef recipes厨师食谱中是否有一系列步骤
【发布时间】:2023-07-11 03:20:01
【问题描述】:

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

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 了解应该先创建目录然后下载??

谢谢

【问题讨论】:

    标签: chef-infra chef-recipe cookbook


    【解决方案1】:

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

    【讨论】:

    • 谢谢 coderanger,当你说使用 remote_file 时,你能解释一下是下载文件还是创建新目录???