要件
- 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 して構築後に手動で直したのはココだけの秘密...。あと、現場での啓蒙活動も大切だなと思ったり。