AWSのOpsWorksでは,デフォルトのcookbookが用意されている.
https://github.com/aws/opsworks-cookbooks
OpsWorksというのは,ここに記述されているレシピを実行しながらインスタンスを起動してくれる.
しかし,ここに自前でカスタムしたcookbookを突っ込むことができる.
それがcustom cookbookとcustom jsonだ.
custom cookbookでレシピを書いて,そこからcustom jsonに書いたデータをnodeから読み込める.
なので,俺もよくcustom cookbookを用意したりするのですが…….
これのデバッグがしたい
OpsWorksのサーバーで動かす前提のcookbookなので,Chefを書いてもなかなかデバッグができない.
もちろん,サーバーを起動して,インスタンスにssh接続し,レシピを書き換えながら,レシピを実行してみれば確認はできる.
だけれど,これはデバッグ方法としてはちょっと手間が多すぎるじゃないですか.
できればローカルで実行したい,というのは誰もが思うところ.
というわけで,構築してみました.
Vagrantを準備
使うのは,vagrant.
ここにchefを流し込んでうまくいくかを試します.
そしてchefを動作させるためにchef-soloを使います.
vagrantのセットアップについては,頑張って調べてください.
OSは適当にOpsWorksで使うOSに合わせたものを用意しておいてください.
ただし,vagrantはsshのconfigに書いておいて,そっちから入れるようにしておいたほうが便利です.
$ vagrant ssh-config Host default HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /Users/akira/.vagrant.d/insecure_private_key IdentitiesOnly yes LogLevel FATAL
これでssh接続に必要な情報が出てくるので,それを~/.ssh/configに記述してやります.
Host vagrant-ubuntu HostName 127.0.0.1 User vagrant Port 2222 IdentityFile /Users/user_name/.vagrant.d/insecure_private_key
あとは,
$ ssh vagrant-ubuntu
でログインできるようになりました.
ホストOSのMac側にknife-soloを入れます
rubyは必要なので,適当に用意しておいてください.
gemは最新の方が何かといいとは思いますので,gemのアップデートをかけます.
この辺,rbenvを使っている方は適宜,合わせてアップデートしてやってください.
$ gem update --system
では,knife-soloを入れます.
$ sudo gem install knife-solo
これで終わりです.
実際にchefを入れて動かす
まず,cookbook用のディレクトリを作ります.
重要な事は,knifeコマンドで作りましょう.
$ knife solo init opsworks
このディレクトリには
.chef .gitignore cookbooks data_bags environments nodes roles site-cookbooks
こんな感じに初期化されています.
cookbooksディレクトリが,デフォルトのcookbookを入れる場所です.
今回の例で言うと,
https://github.com/aws/opsworks-cookbooks
こいつが本来入る場所です.
なので,cloneしてきてあげましょう.
デフォルトのままでいいです.
試し方は割と簡単.
まず,初回は仮想のOSにchef-soloを入れてやる必要があります.
$ knife solo prepare vagrant-ubuntu
コレで入る.
あとは,
$ knife solo cook vagrant-ubuntu
コレで動きます.
でもどれが動くのか?
実行するレシピの設定は,nodes/vagrant-ubuntu.jsonのrun_listに書きます.これはprepareした時点で用意されます.
ちなみに,普段OpsWorksではLayerのオプションに実行するレシピが記述されていますよね.
OpsWorksだとデフォルトでいくつものレシピが実行されると思います.
こういう実行するレシピの設定も……nodes/vagrant-ubuntu.jsonに書けば実行されます.
また,普段custom jsonの内容も同じくnodes/vagrant-ubuntu.jsonに書きます.
{ "custom_env": { "account_id": "hogehoge", "password": "hogehoge" }, "run_list": [ "opsworks::setup", "opsworks::install" ] }
こんな感じです.
この辺は自分がデバッグしたいものに合わせます.
自分のcustom cookbookを入れる
custom cookbookはsite-cookbook/以下のフォルダに配置します.
ここにChefを書いていきましょう.
あとは,このレシピをrun_listに記述すればいいですね.
これで自分のcustom cookbookをvagrant内で実行することができます.
[番外編]sandboxを使う
chefを流す……ということは,vagrantの仮想OSにいろいろなものをインストールするというレシピも含まれる.
そういうもののデバッグをしていると,どうしてもchefでインストールしたものを,クリーンしたいときが出てくる.
もちろん,そういうレシピを書いておけばいいのだけれど,めんどくさいですよね.
そんなときに便利なのがsandbox.
これは,vagrantの仮想OSの状態をcommitしておき,そこまでrollbackできるというすぐれものツール.
これがあれば,とりあえずvagrantの初回起動時にcommitしておけば,空っぽの状態のOSを復元することができる.
vagrantでこれを使うには,saharaというやつが非常に便利です.
インストール方法は以下.
$ git clone https://github.com/ryuzee/sahara.git $ cd sahara $ bundle install $ vagrant plugin install sahara
sandboxモードを開始する
$ vagrant sandbox on
あとは,commitしてrollback.
$ vagrant sandbox commit $ vagrant sandbox rollback
これを多用するとChefのデバッグがかなりはかどります.