【问题标题】:Using a Chef recipe to append multiple lines to a config file使用 Chef 配方将多行附加到配置文件
【发布时间】:2013-05-28 14:01:40
【问题描述】:

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

我知道推荐的模式是 change entire config files 而不仅仅是附加到文件,但出于多种原因我不喜欢这种方法。

到目前为止,我找到的唯一解决方案是使用cookbook_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 模式。

【问题讨论】:

    标签: linux chef-infra chef-recipe


    【解决方案1】:

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

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

    有更多信息here 和这个example cookbook

    只要您有权访问原始配置模板,只需将 &lt;%= render "original_config.erb" %&gt; 附加到您的 parms_to_append.conf 模板的顶部即可。

    【讨论】:

      【解决方案2】:

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

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

      您可以在 stackoverflow 上找到 here 的示例,以及在 rubydoc.info 上的完整文档

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

      【讨论】:

        【解决方案3】:

        我做了这样的事情:

        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
        

        【讨论】:

          【解决方案4】:

          解决这个问题的最简单方法是创建一个字符串并将其传递给内容。当然 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
          

          【讨论】:

            【解决方案5】:

            这是在匹配后插入 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 搜索正则表达式/字符串,它会在匹配后插入值。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-02-04
              • 1970-01-01
              • 2018-10-03
              • 1970-01-01
              • 1970-01-01
              • 2015-05-12
              • 1970-01-01
              • 2013-11-03
              相关资源
              最近更新 更多