web-dev-qa-db-ja.com

Chefレシピを使用して構成ファイルに複数の行を追加する

特定の構成ファイルに複数の行(20〜30)を追加するChefレシピを作成しようとしています。

推奨されるパターンは ファイル全体に変更する)ではなく---(configファイル全体を変更する であると認識していますが、いくつかの理由でこのアプローチは嫌いです。

これまでのところ、私が見つけた唯一の解決策はcookbook_file次に、bashリソースを使用して次のことを行います。

cat lines_to_append >> /path/configfile

Chef-clientを実行するたびにファイルを繰り返し追加するため、これは明らかに正しく機能しません。最初に特定の文字列をチェックする小さなbashスクリプトを作成し、見つからない場合にファイルに追加する必要があります。

しかし、これはChefを使用する目的に反するようです。もっと良い方法があるはずです。

有望な解決策の1つは、OpsCode Communityの line cookbook でした。それはこの正確な問題を解決することを目的とした。残念ながら、機能は不完全でバグが多く、コードはただのハックです。固溶体とはほど遠い。

私が評価した別のオプションは augeas でした。かなり強力に思えますが、システムに抽象化のレイヤーがさらに追加されます。私の場合、やりすぎです。

これがどのシステム管理者にとっても最も明白なタスクの1つであることを考えると、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パターンであるかどうかはわかりません。

11
Gui Ambros

ご存じのとおり、Chefの推奨パターンはファイル全体を管理することです。

Chef 11を使用している場合は、達成しようとしているものにおそらくパーシャルを使用できます。

詳細は here で、これには example cookbook があります。

元の設定テンプレートにアクセスできる限り、<%= render "original_config.erb" %>テンプレートの先頭にparms_to_append.confを追加するだけです。

10
cassianoleal

前に述べたように、テンプレートと partials を使用することは、これを行う一般的な方法ですが、chefはファイルを追加したり、ファイルの行を変更(編集)することさえできます。 Appendindは、次の関数を使用して実行されます。

  • insert_line_after_match(正規表現、改行);
  • insert_line_if_no_match(正規表現、改行)

Stackoverflowで here を見つけて例を示し、 rubydoc.info で完全なドキュメントを見つけることができます。

パーシャルとテンプレートが適切でない場合にのみ、注意して使用してください。

9
Konzulic

私はこのようなことをしました:

monit_overwrites/templates/default/monitrc.erb:

#---FLOWDOCK-START
set mail-format { from: [email protected] }
#---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
5
Kasper Grubbe

これに取り組む最も簡単な方法は、文字列を作成してコンテンツに渡すことです。もちろん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
1
ABCD

Rubyブロックの例は、一致後に2つの新しい行を挿入するためのブロックです。

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は正規表現/文字列を検索し、一致の後に値を挿入します。

0
Ranjith Kumar G