chefでサーバー設定をしてみた。

“chef”というツールが流行っているということで。ちょっと試してみました。 chefというのはサーバーの自動設定ツールで、chefという名に違わず、ツールの各所の名称がknifeだのrecipeだの、命名体系が料理人系のものになっています。 recipeを作っておけばそのとおりにサーバーを料理して(設定して)くれます。 今までは手順書作ってそれを見ながら、そのとおりにちまちまと設定していたんですが、それがコマンド一発でOKになるというのは存外、ありがたいものなんですよね。 SI屋にありがち(?)な、「サーバー設定は体で覚える」とか言って何台もサーバー設定させられて手順を肘とか手首辺りの神経節に叩きこむ、、、ようなことから開放されるんです。 ばしばしコマンドを打つことがストレス発散の一環になっていた私のような変態には若干物足りないきもしますが、このような便利なシロモノが世の中に出てくるのは大変すばらしいことですね。 今回はchefとknife-soloを使って、ローカルのOSX(10.9.4)からAWS_EC2のUbuntu_14.04LTSに向けて調理していきます。 最終的にやりたいことは以下。

  • git,subversion,apache2,その他もろもろ入れて、WordPressが動く環境を作る (SCMを入れるのは趣味)。
  • ついでに中途半端なんだけど、現行サイトからwwwのデータを全部移す

準備をしましょう。

まずローカルにchefとknife-soloをインストール。
sudo gem install chef sudo gem install knife-solo
knife-soloでリポジトリを作成。
knife solo init chef-repo
カレントディレクトにchef-repoというフォルダが出来ます。 次、recipeを格納するcookbookを作成する。
knife cookbook create yorozu-sys -o site-cookbooks
すると、chef-repo/site-cookbooks内に”yorozu-sys”(こののサイト名)が出来上がります。

recipeを作りましょう。

次いで、recipeを作ります。内容を部分抜粋。 [chef-repo/site-cookbooks/yorozu-sys/recipes/default.rb]を編集します。
#install packages
    package "git-core" do
    action :install
end
package "subversion" do
    action :install
end
package "apache2" do
    action :install
end
..中略
# サイトのバックアップ・レストア関係のファイルを設置する。
directory "/home/ubuntu/site-backup" do
    owner "ubuntu"
    group "ubuntu"
    mode '0755'
    action :create
end
# wwwデータバックアップ用のスクリプトを設置
cookbook_file "/home/ubuntu/site-backup/wwwbkup.sh" do
    owner "ubuntu"
    group "ubuntu"
    mode 744
end
# wwwデータリストア用のスクリプトを設置
cookbook_file "/home/ubuntu/site-backup/wwwrestore.sh" do
    owner "ubuntu"
    group "ubuntu"
    mode 744
end
# 現行サイトから抜いてきたwwwデータを設置
cookbook_file "/home/ubuntu/site-backup/www.tar.gz" do
    owner "root"
    group "root"
    mode 644
end
#wwwデータのリストアを行う
execute "www Data Restore" do
    command <<-EOF
    /home/ubuntu/site-backup/wwwrestore.sh
    EOF
end
...後略
ubuntu-14.04をEC2インスタンスで作成して、そこに向けて調理していきます。 当初はEC2(ubuntu)インスタンス作成直後の
sudo aptitude update sudo aptitude upgrade
上記両コマンドもrecipeの中に入れておいたんですが、どうも、aptitude upgradeでエラーが発生してしまいます。 ちょっと調べたところ、タイミングの問題とか、他人が作ったcookbookに依存しているとか、いろいろ情報があるようなんですが、とりあえずここは手打ちでいいだろうと妥協(これが俺の限界なのかっ!?)。

Resourceの説明を少々。

上記recipeに出てくる”package”とか”directory”とか”execute”とか。 これをchefでは、”Resource”と呼びます。 なんとなくは、見た感じでわかると思いますが、
  “package”は、その名の通り、パッケージをインストールします。 debian系ならapt、RedHat系ならyum,rpmを内部で発行してくれます。 OSの差異はchefが埋めてくれますので、recipeを書くときにOSを意識することはありません。
  “directory”は、ディレクトリを作成します。 オーナーとかグループ、属性も設定可能。
  “cookbook_file”は、chef-repo/site-cookbooks/yorozu-sys/filesに置いてあるファイルをサーバーに設置してくれます。 設置したい場所を
cookbook_file [サーバ上の設置場所]
と記述するだけで、filesディレクトリから定義してあるファイルを持ってきて設置してくれます。 これも、オーナー・グループ・属性を設定可能。 cookbook_fileとは別に”template”というResourceがありますが、これは、ファイル内に変数を設定しておいて、実行時にその変数を与えるとファイル内容がその値に書き換えられて設置される、というものです。複数サーバを設定するときにIPアドレスの設定を変数化しておいたりすると便利ですね。
  “execute”は、シェルコマンドを発行できます。 コマンドが複数行に渡る場合はヒアドキュメントを使いましょう。 最初は command “a” command “b” command “c” って書いちゃったんですが、ヒアドキュメント使わないと、一番下のcommand “c”しか実行されないようです。 シェルコマンドが使えると、好き勝手できるからいいですね。 上記例のwwwrestore.shスクリプトは、転送されたwww.tar.gzを解凍して、/var/wwwに上書きする処理が書いてあります。 ちなみにwwwbackup.shは、/var/wwwをtarでまとめてバックアップを取るスクリプト。
  他にもResourceはありますが、上記4点あればそこそこのことはできるでしょう。 シェルコマンドでごりごりやっちゃうのはchef使いとしてどうなのかなあ? と思いはしますが。 chef自体、結構色々と出来るようなので、興味のある方は勉強してみてください。

いざ、実行

EC2のインスタンスを作成し、カッコ悪いですが
sudo aptitude update sudo aptitude upgrade
手動で実行したら、ローカルからまず、
knife solo prepare -i [ec2のkey pairのpem] [ユーザ名]@[ホスト名]
とします。 すると、対象のホスト内に、ssh経由でchefの環境が準備されるようです。 そして料理を始めましょう。
knife solo cook -i [ec2のkey pairのpem] [ユーザ名]@[ホスト名]
ごりごりとコンソールに処理中のログが出力されます。 package “hoge” の処理中には”hoge”と表示されるので、現在の進捗具合がわかります。下のように。
… * package[git-core] action install – install version 1:1.9.1-1 of package git-core * package[subversion] action install – install version 1.8.8-1ubuntu3.1 of package subversion * package[gcc] action install – install version 4:4.8.2-1ubuntu6 of package gcc * package[make] action install – install version 3.81-8.2ubuntu3 of package make * package[apache2] action install – install version 2.4.7-1ubuntu4.1 of package apache2 …
エラーが発生するとそこでメッセージを吐いて止まります。
========================================================== Error executing action `run` on resource ‘execute[www Data Restore]’ ==========================================================
シェルスクリプト内でエラーが発生しても、発生箇所を指摘してくれます。 エラーが発生しなければ、完了。
… * execute[www Data Restore] action run – execute /home/ubuntu/site-backup/wwwrestore.sh Running handlers: Running handlers complete Chef Client finished, 9/22 resources updated in 16.813932063 seconds
22プロセスのうち、9プロセスを実施しました、とな。 ちなみに、cookを一回実行して、再実行しても、 「バッケージを再インストールする」ことにはなりません。
* package[git-core] action install (up to date) * package[subversion] action install (up to date) * package[gcc] action install (up to date) * package[make] action install (up to date) * package[apache2] action install (up to date)
ちゃんとこういうふうに(up to date)と出て、スルーしてくれます。 ファイルのコピーも、ローカルのファイル内容を変更すれば、それを検知して、変更されたファイルだけを更新してくれます。 便利便利。
— /home/ubuntu/site-backup/wwwrestore.sh 2014-09-09 13:31:03.836223999 +0900 +++ /tmp/.wwwrestore.sh20140909-7175-rjo8in 2014-09-09 13:33:42.420223999 +0900 @@ -11,7 +11,7 @@ exit 1 fi -if [ ! -e $BASE_DIR$TGT_FILE ]; then +if [ ! -e $BASE_DIR$TGT_FILE/tmp ]; then echo -n “Make Temporary Directory…” mkdir tmp echo “done.”
こんなふうに、修正した箇所もunified形式のpatchログとして出力されます。優しいなシェフ。

これは一度使うと手放せん。

私のサイトの場合は 「既存サイトでバックアップを取ったwww.tar.gzを新しいサイトにコピーする」 といったところを自動化できていません(www.tar.gzはcookbooksのfilesディレクトリに手動で入れる)が、たぶんそこも自動化できるような気がします。 このサイトもEC2でimmutable infrastructureの真似事をやっているし、chefは最初のイメージよりも思ったよりも簡単に出来たので、これからも使っていこうと思います。 Windowsにも対応しているようなので、数年前にこれを知っていたら、大変仕事の効率が上がったんですけどねえ。 体に手順を叩きこむ事ほど、なにかこう、儚いものはないなあ・・・と。 仕事場で人間手順書になっている方はぜひchef使ってみてください。 まずはこの書籍が分かりやすいと思います。 Kindle版しかないのかな? chefを手っ取り早く使うために必要最小限のことがまとまっており、大変お世話になりました。]]>