我想使用厨师食谱配方编辑文件。 该文件现在显示为,
[attribute1]
foo=bar
[attribute2]
....
我想改变它:
[attribute1]
foo=bar
newfoo=newbar
[attribute2]
....
所以基本上,我想添加一行,如果它不存在于文件中,我想在该文件中的特定行之后添加它。
我在Class: Chef::Util::FileEdit
下找到了2个选项,这些选项在insert_line_after_match
和insert_line_if_no_match
有用。但我想要一个可以执行这两个操作的选项。如果我使用insert_line_after_match
,它适用于第一次运行但是对于下一次运行它只是继续添加行,即使行已经在文件中。如果文件中不存在行,insert_line_if_no_match
会在文件末尾添加行,但我想在该文件中的特定行之后添加行。
我对厨师食谱有点新鲜。有没有解决方案来解决上述问题?
答案 0 :(得分:1)
我建议不要编辑文件,而是覆盖它们。您应该在cookbook中创建一个模板或文件,然后使用template
或cookbook_file
资源使用cookbook中的文件覆盖计算机上的文件。
您的配置文件看起来与toml类似,因此您也可以使用toml-rb gem从json(数据包)或类似的属性生成此文件:
chef_gem 'toml-rb' do
compile_time false
end
file '/path/to/file.conf' do
content( lazy do
require 'toml'
"# This file is managed by Chef\n" +
TOML.dump( my_json )
end )
end
答案 1 :(得分:0)
非常请不要使用FileEdit。它是一个内部API,不供公众使用。你想要的是WantedEquipment.all.each do |eq|
eq.email
end
食谱,特别是line
自定义资源。确保你非常仔细地制作你的正则表达式。
一般来说,我们不推荐这种管理方式,因为它非常脆弱,容易被无关的改变打破。更好的选择是使用replace_or_add
资源或类似资源以收敛方式管理整个文件。