eRubyとYAMLで簡単テンプレートシステム

『サーバごとにちょっと変えるだけ』、『似たような記述の繰り返し』、というようなコンフィグを作る時はできるだけテンプレート化するようにしてます。


ツールとしては使ってるのはeRubyとYAML、どちらもRubyいれればパーサがついてくるはず。
差分のある部分はYAMLで定義して、eRubyテンプレートとガッチャンコ。

例としてkeepalivedの振り分け設定ファイルを作ってみます

パースプログラム
#!/usr/bin/ruby
require 'yaml'
require 'erb'

tpl, yaml = ARGV
v = YAML.load(File.read(yaml))
puts ERB.new(File.read(tpl)).result
サンプルYAMLファイル
domain: test.jp
vip: 192.168.0.1
rips:
  - 192.168.0.11
  - 192.168.0.12
サンプルテンプレート
virtual_server <%= v['vip'] %> 80 {
  delay_loop 5
  lb_algo wrr
  lb_kind DR
  protocol TCP
  virtualhost <%= v['domain'] %>

<% v['rips'].each do |rip| %>
  real_server <%= rip %> 80 {
    weight 10
    HTTP_GET {
      url {
        path /healthcheck.html
        status_code 200
      }
    }
  }
<% end %>
}
実行結果
$ ruby parse.rb test.tpl test.yaml 
virtual_server 192.168.0.1 80 {
  delay_loop 5
  lb_algo wrr
  lb_kind DR
  protocol TCP
  virtualhost test.jp


  real_server 192.168.0.11 80 {
    weight 10
    HTTP_GET {
      url {
        path /healthcheck.html
        status_code 200
      }
    }
  }

  real_server 192.168.0.12 80 {
    weight 10
    HTTP_GET {
      url {
        path /healthcheck.html
        status_code 200
      }
    }
  }

}


最近はZabbixの設定インポート用ファイルの作成にも使ってます。
こういうのPuppetとかでちゃんと管理したいなぁ。