ChefでINIファイルを扱う例を示す
INIファイルを扱うレシピの例
recipes/default.rb
gem_package 'inifile' do
action :nothing
end.run_action(:install)
require 'inifile'
file '/etc/conf.ini' do
content lazy {
inifile = if File.file?(path)
IniFile.load(path)
else
IniFile.new
end
# iniファイルを自由に編集
inifile['foo']['bar'] = 'baz' # [foo]にbar=bazを追加
# 他の編集例
# inifile.delete_section('foo') # [foo]セクションを削除
# inifile['foo'] = inifile['foo'].delete_if { |key,val| key == 'bar' } # [foo]からbar=を削除
# inifile['foo'] = { 'bar2' => 'baz2' } # [foo]下をbar2=baz2に置き換え
inifile.to_s # テキストに戻す
}
end
- iniファイルがなければ以下の内容で作成する。
[foo]
bar = baz
- iniファイルがある場合、[foo] セクションにおける bar の値を baz に設定する。
Chef ClientのRubyへのinifile gem導入は、require 'inifile'をエラーなく通す為、Ruby実行フェーズで行なっている。
「iniファイルを自由に編集」の箇所は、多重loopを使うなどご自由に。
編集に使用可能なメソッドは以下のClass: IniFileを参照
if文は3項演算子に置き換え可。
参考
Ansibleの場合
ini_fileモジュールがあるが、こういった階層的なデータをloopで扱うとAnsibleでは醜くなりそう。