ようへいの日々精進XP

よかろうもん

chef を現場投入してみて気づいたことの幾つか

要件

  • chef を現場投入してみて気づいたことを整理する

どんな風に使ったのか

  • テンプレート作成した仮想ホスト 2 台に対して下記の状態に収束させる為に使った
    • /etc/hostname と /etc/hosts をホスト毎で設定
    • ssh の root ログインの許可を停止
    • 各種パッケージの導入
    • 各種設定(認証周り、メール設定等)

工夫したところとメリット

メリット

  • 従来は自家製シェルスクリプトを走らせた後、幾つかの質問に答える必要があったが不要になった
  • 10 分/台 → 5 分/台に短縮

工夫したところ

テンプレートからホストを作成する為、ホスト名を修正する必要があったが、nodes/${IP_address}.json ファイルにホスト名を入れて template リソースを使ってホスト毎で上書きをした。→結果として IP アドレスとホスト名の管理を nodes/${IP_address}.json ファイル で出来るのでは?というアイデアが湧いた...

JSON ファイル...

${chef-repo}/nodes/${IP_address}.json

以下のように記載。

{
"host_name": ${your_hostname},
"run_list":
        [
                "recipe[${recipe}]"
        ]
}

該当するレシピは...

${chef-repo}/${cookbook}/site-cookbooks/hostname_setting.rb

以下のように記載。

# /etc/hostname setting
template "/etc/hostname" do
        source "hostname.erb"
        owner "root"
        group "root"
        mode 0644
        variables({
                :hostname => node[:host_name] # node ファイルで指定した値が入る
        })
end
# /etc/hosts setting
template "/etc/hosts" do
        source "hosts.erb"
        owner "root"
        group "root"
        mode 0644
        variables({
                :hostname => node[:host_name] # node ファイルで指定した値が入る
        })
end

利用するテンプレートファイル(一部)...

${chef-repo}/${cookbook}/templates/default/hostname.erb

以下のように記載。

<%= @hostname %>

問題点、今後の課題

knife solo の並列処理(複数サーバーへの実行)

  • 今回、knife solo を二台同時に叩く方法として tmux で画面分割して叩いた。二台ならこの方法でもいけるけど、二台以上は現実的ではない...
  • 解決策として roundsman というツールがあるのを勉強会で聞いているで試してみたい!

出来るだけコードは短く、綺麗に...

  • パッケージインストール等は出来るだけまとめて書く
%w{hoge huga baz}.each do |hoges|
         package hoges do
         action: install
end
  • 上から下にダラダラとではなく not_if や only_if 、nothing を使う
  • 冗長は避け、且つ、他人の可読性の高いレシピを書く

本当に意図した通りに収束しているか?

  • cookbook の意図した通りに反映されているかを確認したい
  • レシピのシンタックスエラーを事前に確認したい

これらの要望を実現できるのが...以下を習得する必要がある。

  • knife cookbook test
    • レシピのシンタックスエラーを確認
  • whyrun
    • cookbook 実行時のエラーが出ないかをある程度調べる事が出来る
  • chefspec
  • serverspec
    • 実際にサーバーにアクセスしてのユニットテストで chef 以外にも puppet 等でも使えるはず...
    • 個人的には手動でセットアップされたサーバーでも使えそうだなと期待

出来るだけ自動化を目指す

whyrun → knife-solo 実行 → テスト(チェック)

という一連の流れを自動化し、属人化によるミスを減らしていきたい...とは言え...ホスト名を typo して構築後に手動で直したのはココだけの秘密...。あと、現場での啓蒙活動も大切だなと思ったり。