ChefでさくらVPSの環境構築を自動化する

入門Chef Solo - Infrastructure as Code を参考に、Chefを使ってさくらVPSの環境構築を自動化した。

関連記事

前提

サーバの環境構築をChefで自動化する場合、まずはVagrantなどで作成したローカルのVMを使って試行錯誤しながらレシピを開発し、レシピが完成したらサーバに対して実行する、という手順をふむ場合が多いと思う。Vagrantで立ち上げたVMに対してChefでプロビジョニングを行う手順についてはChefとVagrantによる開発環境の構築を参照のこと。

今回作成したCookbook

今回作成したCookbookはGithubに置いてあるので下記リンクを参照のこと。
chef-repo/site-cookbooks/server · tanimichi/chef-repo
レシピ作成の方針として、今回はOpscodeやサードパーティ製のCookbooksを一切使用せず、全部自分で書いた。既存のCookbooksは、出来にもばらつきがあって玉石混交だし、他の人が作ったレシピを使ってしまうと裏で何をやっているのか分からなくなるので、できることなら全部自分で書いたほうがChefの理解も深まっていいと思う。

プロビジョニングの実行

今回は契約した直後の状態のさくらVPSをプロビジョニング実行対象のサーバとして使用した。OSもデフォルトのCentOSのまま使用した。他のディストリビューションをカスタムOSインストールしている場合や手動で何かしらの設定を既に行っている場合は、OS再インストールでまっさらな状態のCentOSに戻してから実行してください。

まずはローカルのマシンにChefのCookbookを用意する。

% git clone https://github.com/tanimichi/chef-repo.git

knif solo prepareを実行する。

% cd chef-repo
% knife solo prepare root@111.111.111.111

ここでもし、ERROR: Net::SSH::HostKeyMismatch: fingerprint というエラーがでた場合は~/.ssh/known_hosts を削除して下さい。

Thank you for installing Chef!
Generating node config 'nodes/111.111.111.111.json'...

と表示されたら成功。nodes/111.111.111.111.jsonを編集する。雛形として使えるようnodes/example.server.jsonというファイルを用意しておいたので、これを参考にnodes/111.111.111.111.jsonを編集して下さい。

{
    "user": {
    "name": "tanimichi",
    "password": "$1$8kfYCUl9$84.IOB8F4W00vI2h0vQKo0"
    },
    "ssh": {
    "port": 29622
    },
    "run_list": [
    "recipe[server]"
    ]
}

上記の例では、

ユーザ名: tanimichi
パスワード: tanimichi
sshのport番号: 29622

としてある。node[:user][:password]の値は、パスワードを平文で記入するのではなく、

$ openssl passwd -1 tanimichi
$1$8kfYCUl9$84.IOB8F4W00vI2h0vQKo0

として、表示された文字列を記入して下さい。詳細はuser - Chef Docsを参照のこと。

最後に、公開鍵認証をするために、自分の公開鍵(~/.ssh/id_rsa.pub)を
chef-repo/site-cookbooks/server/files/default/id_rsa.pub
にコピペする。

以上で準備は整ったので、knif solo cookを実行する。

% knife solo cook root@111.111.111.111

何度もパスワードが聞かれるが、これはしょうがないので聞かれる度に入力し続ける。どういうこと言うと、knifeコマンドは内部でsshを使用しているが、この時点でサーバは公開鍵認証の設定をしていないので(公開鍵認証の設定もレシピのなかに用意してあり、Chefがやってくれるから)この時点ではknifeコマンドはパスワード認証でsshしている。knifeコマンドがサーバ側でChefを実行するのに必要なデータをクライアントPCからサーバに送るために、内部ではrsyncしているのだが、パスワード認証でsshしている場合、rsyncする際のパスワード入力を省略できないため、毎回入力するしかない。knife solo cookする際に-VVオプションをつけて、

% knife solo cook root@111.111.111.111 -VV

とすると、より詳細なログが標準出力に表示されるので、rsyncするのためにパスワード入力が求められていることが確認できる。

DEBUG: rsync -rl -v  --rsh="ssh root@111.111.111.111" --delete --exclude 'revision-deploys' --exclude 'tmp' --exclude '.git' --exclude '.hg' --exclude '.svn' --exclude '.bzr' /Users/tkr/Desktop/work/chef-repo/cookbooks/ :~/chef-solo/cookbooks-1
root@111.111.111.111's password:

Chefの実行が完了したらsshしてちゃんとプロビジョニングできているか確認する(ポート番号はjsonファイルに記入した番号を指定して下さい)。

ssh -p 29622 tanimichi@111.111.111.111

今回使用したレシピでは、レシピの最後の方でiptablesの設定を行っているため、プロビジョニングを実行後、ssh接続するにはjsonファイルで指定したポート番号を使用する必要がある(デフォルトの22番ポートでは接続できなくなる)。

knife solo cookもデフォルトでは22番号ポートを使用するため、プロビジョニングを実行後、knife solo cookを再度実行したい場合は、ポート番号を指定してやるか、あるいは、さくらVPSをOS再インストールしてまっさらな状態から実行しなおせばいい。OS再インストールするのは手間に思えるが、実際やってみるとさくらVPSの場合は数分で完了するし、サーバの設定はChefで全部自動化しているため意外と悪くない選択肢な気がする。

参考文献

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)