厨师食谱FileEdit insert_line_after_match和insert_line_if_no_match

时间:2017-02-28 01:32:54

标签: ruby chef chef-recipe cookbook

我想使用厨师食谱配方编辑文件。 该文件现在显示为,

[attribute1]
foo=bar
[attribute2]
....

我想改变它:

[attribute1]
foo=bar
newfoo=newbar
[attribute2]
....

所以基本上,我想添加一行,如果它不存在于文件中,我想在该文件中的特定行之后添加它。

我在Class: Chef::Util::FileEdit下找到了2个选项,这些选项在insert_line_after_matchinsert_line_if_no_match有用。但我想要一个可以执行这两个操作的选项。如果我使用insert_line_after_match,它适用于第一次运行但是对于下一次运行它只是继续添加行,即使行已经在文件中。如果文件中不存在行,insert_line_if_no_match会在文件末尾添加行,但我想在该文件中的特定行之后添加行。

我对厨师食谱有点新鲜。有没有解决方案来解决上述问题?

2 个答案:

答案 0 :(得分:1)

我建议不要编辑文件,而是覆盖它们。您应该在cookbook中创建一个模板或文件,然后使用templatecookbook_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资源或类似资源以收敛方式管理整个文件。