2017-02-28 104 views
1

我想使用厨师食谱配方编辑文件。 如,厨师食谱FileEdit insert_line_after_match和insert_line_if_no_match

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

我想改变它像现在,该文件显示:

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

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

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

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

回答

1

我会建议不编辑文件,而是覆盖它们。您应该在食谱内创建一个模板或文件,然后使用templatecookbook_file资源使用cookbook中的文件覆盖机器上的文件。

您的配置文件类似于toml,所以你也可以使用toml-rb宝石生成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

漂亮请不要使用FileEdit。这是一个内部API和而不是打算供公众使用。你想要的是line食谱,特别是replace_or_add自定义资源。确保你非常小心地制作你的正则表达式。

一般来说,我们不推荐这种管理风格,因为它非常脆弱,容易被无关的变更破坏。更好的选择是使用template资源或类似的方式来以收敛的方式管理整个文件。