使用Chef配方将多行附加到配置文件

Gui*_*ros 11 linux chef-infra chef-recipe

我正在尝试创建一个Chef配方,将多行(20-30)附加到特定的配置文件中.

我知道推荐的模式是更改整个配置文件而不是仅仅附加到文件,但出于多种原因我不喜欢这种方法.

到目前为止,我找到的唯一解决方案是使用a cookbook_file然后使用bash资源来执行:

cat lines_to_append >> /path/configfile

显然这不会正常工作,因为每次运行chef-client时它都会反复追加文件.我必须首先创建一个小的bash脚本来检查特定的字符串,如果没有找到,则附加到该文件.

但这似乎打败了使用Chef的目的.肯定有更好的办法.

一个有希望的解决方案是来自OpsCode社区的系列食谱.它旨在解决这个确切的问题.不幸的是,功能不完整,错误,代码只是一个快速的黑客.远非一个坚实的解决方案.

我评估的另一个选择是augeas.看起来非常强大,但它还为系统添加了另一层抽象.在我的情况下,矫枉过正.

鉴于这是任何系统管理员最明显的任务之一,是否有任何简单而美观的解决方案与厨师,我没有看到?


编辑:这是我到目前为止解决它的方式:

 cookbook_file "/tmp/parms_to_append.conf" do
   source "parms_to_append.conf"
 end

 bash "append_to_config" do
   user "root"
   code <<-EOF
      cat /tmp/parms_to_append.conf >> /etc/config
      rm /tmp/parms_to_append.conf
   EOF
   not_if "grep -q MY_IDENTIFIER /etc/config"
 end
Run Code Online (Sandbox Code Playgroud)

它有效,但不确定这是推荐的Chef模式.

cas*_*eal 10

正如您自己所说,推荐的Chef模式是管理整个文件.

如果您正在使用Chef 11,您可能会使用partials来实现您想要实现的目标.

还有更多的信息在这里并在此例子食谱.

只要您有权访问原始配置模板,只需附加<%= render "original_config.erb" %>parms_to_append.conf模板的顶部即可.


Kon*_*lic 9

如前所述,使用模板和部分是常见的方法,但是厨师允许附加文件,甚至更改(编辑)文件行.使用以下函数执行Appendind:

  • insert_line_after_match(regex,newline);
  • insert_line_if_no_match(正则表达式,换行符)

您可能会发现和例如这里的计算器,以及完整的文档rubydoc.info

请谨慎使用,并且仅在部分和模板不合适时使用.


Kas*_*bbe 5

我做了这样的事情:

monit_overwrites/templates/default/monitrc.erb:

#---FLOWDOCK-START
set mail-format { from: monit@ourservice.com }
#---FLOWDOCK-END
Run Code Online (Sandbox Code Playgroud)

在我的食谱中,我这样做了:

monit_overwrites/recipes/default.rb:

execute "Clean up monitrc from earlier runs" do
  user "root"
  command "sed '/#---FLOWDOCK-START/,/#---FLOWDOCK-END/d' > /etc/monitrc"
end

template "/tmp/monitrc_append.conf" do
  source "monitrc_append.erb"
end

execute "Setup monit to push notifications into flowdock" do
  user "root"
  command "cat /tmp/monitrc_append.conf >> /etc/monitrc"
end

execute "Remove monitrc_append" do
  command "rm /tmp/monitrc_append.conf"
end
Run Code Online (Sandbox Code Playgroud)