Chef,强制创建后文件不存在
Chef, File does not exists after force the creation
我在菜谱中有以下逻辑,如果文件丢失则创建一个文件,然后尝试在其中插入一些行。
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')
这又是厨师二相性的问题。第一遍中的纯 ruby 代码 运行s。这是 "compile" 或 "resource gathering" 阶段。厨师资源的 ruby 代码只是将资源定义添加到资源列表中。完成后,就会发生第二个 "execution" 阶段。此阶段将实际执行资源。因此,在您的 FileUtils 代码失败之前,您的 file
声明实际上不会执行任何操作。
您可以做两件事:
首先,您真的应该尽可能避免在您的食谱中使用 FileUtils。如果可以的话,最好使用模板创建文件。
其次,如果您稍微更改文件声明,您可以在第一阶段将其修改为 运行:
xz
file "/root/myfile" do
owner 'root'
group 'root'
mode '400'
action :nothing
end.run_action(:create_if_missing)
我在菜谱中有以下逻辑,如果文件丢失则创建一个文件,然后尝试在其中插入一些行。
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')
这又是厨师二相性的问题。第一遍中的纯 ruby 代码 运行s。这是 "compile" 或 "resource gathering" 阶段。厨师资源的 ruby 代码只是将资源定义添加到资源列表中。完成后,就会发生第二个 "execution" 阶段。此阶段将实际执行资源。因此,在您的 FileUtils 代码失败之前,您的 file
声明实际上不会执行任何操作。
您可以做两件事:
首先,您真的应该尽可能避免在您的食谱中使用 FileUtils。如果可以的话,最好使用模板创建文件。
其次,如果您稍微更改文件声明,您可以在第一阶段将其修改为 运行: xz
file "/root/myfile" do
owner 'root'
group 'root'
mode '400'
action :nothing
end.run_action(:create_if_missing)