gpt4 book ai didi

ruby - Chef,强制创建后文件不存在

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:39 25 4
gpt4 key购买 nike

我在 Recipe 中有以下逻辑,如果文件丢失,则创建一个文件,然后尝试在其中插入一些行。

file "/root/myfile" do
owner 'root'
group 'root'
mode '400'
action :create_if_missing
end

file = Chef::Util::FileEdit.new('/root/myfile')

data_bag('my_databag').each do |user|

# ... lines using Chef resources like user, group, etc.

if node.chef_environment != "my_env"
line = "something to write in myfile"
Chef::Log.info("-----> #{line}")
file.insert_line_if_no_match(/#{line}/, line)
end
end

file.write_file

myfile 不存在的情况下,配方失败,尽管我在导致异常的指令之前强制创建文件。所以这是错误:

ArgumentError
-------------
File '/root/.testfile' does not exist

Relevant File Content:
----------------------
18:
19>> file = Chef::Util::FileEdit.new('/root/.testfile')
20:

谁能帮我理解为什么这不起作用?对此的任何帮助将不胜感激。

更新:我尝试先触摸文件,但仍然在同一行失败:

 26:  FileUtils.touch('/root/myfile')
27>> file = Chef::Util::FileEdit.new('/root/.testfile')

最佳答案

这是 Chef 的两阶段性质的另一个问题。纯 ruby​​ 代码在第一遍运行。这是“编译”或“资源收集”阶段。 Chef 资源的 ruby​​ 代码只是将资源定义添加到资源列表中。完成之后,就会发生第二个“执行”阶段。此阶段将实际执行资源。因此,直到您的 FileUtils 代码失败之后,您的 file 声明才真正执行任何操作。

你可以做两件事:

首先,您真的应该尽可能避免在您的配方中使用 FileUtils。如果可以的话,最好使用模板创建文件。

其次,如果稍微更改文件声明,您可以破解它以在第一阶段运行:xz

file "/root/myfile" do
owner 'root'
group 'root'
mode '400'
action :nothing
end.run_action(:create_if_missing)

关于ruby - Chef,强制创建后文件不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31409649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com