特定の構成ファイルに複数の行(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パターンであるかどうかはわかりません。
ご存じのとおり、Chefの推奨パターンはファイル全体を管理することです。
Chef 11を使用している場合は、達成しようとしているものにおそらくパーシャルを使用できます。
詳細は here で、これには example cookbook があります。
元の設定テンプレートにアクセスできる限り、<%= render "original_config.erb" %>
テンプレートの先頭にparms_to_append.conf
を追加するだけです。
前に述べたように、テンプレートと partials を使用することは、これを行う一般的な方法ですが、chefはファイルを追加したり、ファイルの行を変更(編集)することさえできます。 Appendindは、次の関数を使用して実行されます。
Stackoverflowで here を見つけて例を示し、 rubydoc.info で完全なドキュメントを見つけることができます。
パーシャルとテンプレートが適切でない場合にのみ、注意して使用してください。
私はこのようなことをしました:
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
これに取り組む最も簡単な方法は、文字列を作成してコンテンツに渡すことです。もちろん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
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
は正規表現/文字列を検索し、一致の後に値を挿入します。