13

我正在尝试创建一个厨师食谱以将多行(20-30)附加到特定的配置文件中。

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

到目前为止,我发现的唯一解决方案是使用 acookbook_file然后使用 bash 资源来执行以下操作:

cat lines_to_append >> /path/configfile

显然这不能正常工作,因为它会一遍又一遍地附加文件,每次你运行 chef-client。我必须先创建一个小型 bash 脚本来检查特定字符串,如果未找到,则附加到文件中。

但这似乎违背了使用 Chef 的目的。一定会有更好的办法。

一个有希望的解决方案是来自 OpsCode 社区的line cookbook 。它旨在解决这个确切的问题。不幸的是,功能不完整,有缺陷,而且代码只是一个快速破解。远非一个可靠的解决方案。

我评估的另一个选项是augeas。看起来非常强大,但它会为系统添加另一层抽象。就我而言,矫枉过正。

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


编辑:这是我目前解决的方法:

 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

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

4

5 回答 5

11

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

如果您使用的是 Chef 11,您可能会利用部分内容来实现您想要实现的目标。

此处和此示例食谱有更多信息。

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

于 2013-06-02T23:54:40.970 回答
9

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

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

您可以在 stackoverflow 上找到示例,以及ruby​​doc.info上的完整文档

请谨慎使用,仅在部分和模板不合适的情况下使用。

于 2013-12-02T10:39:43.057 回答
5

我做了这样的事情:

monit_overwrites/templates/default/monitrc.erb:

#---FLOWDOCK-START
set mail-format { from: monit@ourservice.com }
#---FLOWDOCK-END

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

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
于 2014-05-29T12:07:40.973 回答
1

解决这个问题的最简单方法是创建一个字符串并将其传递给内容。当然 bash 块可以工作......但我认为文件资源很优雅。

lines = ""
File.open('input file') do |f|
   f.lines.each do |line|
      lines = lines  + line + "\n"
   end
end
file "file path"  do
   content line
end
于 2017-09-05T21:39:17.140 回答
1

这是用于在匹配后插入 2 个新行的示例 ruby​​ 块:

ruby_block "insert_lines" do
  block do
    file = Chef::Util::FileEdit.new("/etc/nginx/nginx.conf")
    file.insert_line_after_match("worker_rlimit_nofile", "load_module 1")
    file.insert_line_after_match("pid", "load_module 2")
    file.write_file
  end
end

insert_line_after_match搜索正则表达式/字符串,它将在匹配后插入值。

于 2019-10-12T04:37:37.223 回答