今からお前んちこいよ

多摩川沿いにて細々とお勉強。

chefからitamaeに変えた話 - サーバを構築しよう! - プロビジョニング!

日本語 | English

概要

しばらく前にchefからitamaeに変えた。
運用してみて思ったこと困ったこととかをつらつら書く。

今のところサーバ構築とリリースレシピが共存してる感じ。
今後分けるかって雰囲気はある。

itamae?

Itamae by itamae-kitchen
プロビジョニングツール。
chefが荒れていたうちの状態からだと特に不利な点は見当たらなく、
移行時は利点しかなかった。

  • ruby製(chef書いてたし学習コスト低)
  • chefと記述がほぼ同じ(学習コスト低)
  • 実行元サーバにだけitamaeインストールでおk ←最大の利点
    (対象サーバにはitamaeインストール不要)
  • ディレクトリ構造が自由自在
  • 基本シンプルで足りないものを追加していける

実際chefからitamaeの移行は全くもってスムーズだった。

うちのitamae

概要にもあるとおり、現状うちのitamaeは
サーバ構築系とリリースレシピが共存してる

ディレクトリ構造

公式ページにある Best-Practice を元にした。

.
|-- entrypoint.rb
|-- cookbooks    ・・・ 諸々インストール、どのサーバでも使う系
|   |-- apache
|   |-- cron
|   |-- fluentd
|   `-- git
|-- nodes 
|   `-- servers    ・・・ 各サーバ構築用json
|   |   |-- bar.json
|   |   `-- foo.json
|   `-- release_hogehoge.json ・・・ 案件とかリリースリポジトリごとにjson
`-- roles    ・・・ リリース作業とか独自の手順系を入れる(chefだとjsonでしたね)
    |-- compile_hogehoge.rb
    `-- release_hogehoge.rb

$ itamae ssh -h hosthoge0001 --node-json nodes/sample.json entrypoint.rb
みたいに実行する

entrypoint.rb

実行環境とかホスト名とかをここで設定して、
後で実行されるcookbooksとかroleとかから参照できるようにしてる。

node["recipes"] = node["recipes"] || []
host_name = node[:hostname]                  # SpecinfraというGemを利用しているらしい
host_group = host_name[/(.+)([0-9]){4}/, 1 ]  # 号機を除いたホスト名 ex.) hogehoge0001 -> hogehoge
proxy_host = "bar"
proxy_port = "1234"

# 実行環境
if host_name.index("-dev") != nil then
    env = "dev"
elsif host_name.index("-test") != nil then
    env = "test"
else
    env = "product"
end

node.reverse_merge!(
    common: {
        host_name:  host_name ,
        host_group:  host_group ,
        proxy_host: proxy_host,
        proxy_port: proxy_port,
        env:    env
    }
)

node["recipes"].each do |recipe|
  include_recipe recipe
end

運用してみて困ったこと

分かっている事実はCentOS5系
具体的にうちが困ったのは、
CentOS6系でitamae実行 → 対象サーバがCentOS5系
のときに、環境変数の違いでうまく動かないコマンドがあった。
(CentOS5ってどういう職場だよって感じだ。)

ただ、これに関しては可能性が2つあって、
ただ単にCentOS5系がダメ or バージョン違いのOS間での実行がダメ
のどちらかなんだろうと(◞‸◟)

例えば git

普通だったら

git "/home/hoge/foo" do
    repository  "https://hogehoge.com/bar/foo.git" 
    user        "hoge"
    cwd         "/home/hoge"
    revision    "master"
end

しかしこれだと動かないのでこんなレシピが登場した

execute "git checkout piyo" do
    user "hoge"
    cwd "/home/hoge/bar"
    command "/usr/local/bin/git checkout piyo"
end

例えば useradd

普通だったら

user "useradd #{setting[:username]}" do
    action      :create
    username    setting[:username]
    home        setting[:home]
    password    setting[:password]
    shell       setting[:shell]
    create_home setting[:create_home]
end

しかしこれだと動かなかった。
さらにroot権でしか使えないコマンドたち(sbin/系)は
どうあがいてもダメで結局レシピ化できなかった。

終わりに

itamaeでも困ってるけど、
結局のところchefはもうだめなのか?っという話ではなく、
実際にうまいことchefを使っているチームもみる。
運用方法が悪いのがダメになる理由の大半かなって思う。
参考)

www.creationline.com