ダメSE uramonの奮闘記

インフラ関連技術など

【Chef Tips 1】 カーネルパラメータの設定(sysctl.conf)

 ファイルを編集する場合、主にTemplateリソースを使用する。しかし、一部の定義のみ入れ替えたい、ファイルを丸ごと入れ替えたくない、といった場合には、ruby_block+FileEditユーティリティが役立つ。

 以下は、”net.core.somaxconn"(カーネルがキューイング可能なパケットの最大個数)が定義されていなかった場合、ファイルの最終行に定義を追加、最後にリロードするというもの。

 

ruby_block "Edit /etc/sysctl.conf" do
  block do
    rc = Chef::Util::FileEdit.new("/etc/sysctl.conf")
    rc.insert_line_if_no_match(/^net.core.somaxconn.*$/, "net.core.somaxconn = 1000"
    rc.write_file
  end
  notifies :run, "execute[Reload /etc/sysctl.conf]"
end

execute "Reload /etc/sysctl.conf" do
  command "sysctl -p"
  action :nothing
end

 

ポイント

  • "rc = ~"の”rc"は任意の文字列
  • ”insert_line_if_no_match”の部分のメソッドには、いくつかの種類がある。詳しくはこちらを参照。
  • Chefのバグで、"insert_line_if_no_match"を2回以上使うと、最初のものしか有効にならない。そのほかのメソッドについては、何回でも使用可能。
  • "/^net.core.somaxconn.*$/"の部分は、マッチングさせたい条件を"/"で囲まれた部分にRuby正規表現で記述する。
  • ruby_blockの後の""には、任意の文字列を設定できるが、ランリスト中の他の名称と重複しないようユニークにする。そうしないとコンパイルで警告となる。