Chef で AWS
まずは Chef で AWS 、下記を参考に
- Chefを使用してEC2インスタンスを操作するチュートリアル:その1 – サーバーワークスエンジニアブログ
- Chefを使用してEC2インスタンスを操作するチュートリアル:その2 – サーバーワークスエンジニアブログ
あと
取敢えず Debian 6.0.4 squeeze をインストールする。Ruby は ruby1.9.1-full パッケージで 1.9.2、コマンド類は ruby1.9.1 とかバージョン数字付きなので、ないのシンボリックリンク作る(update-alternatives --query ruby に ruby の登録はない)。
gem のバージョンは 1.3.7、Debianのパッケージになってるので更新は出来ない。
という辺りで「sudo gem indtall chef (--no-ri --no-rdoc 注意)」。結構いろいろ一緒に、「chef-client -v」は「chef-client -v」。
そして「sudo gem install knife-ec2」はそのままでは失敗、依存する nokogiri に libxml2-devパッケージとl ibxslt1-devパッケージが必要となる、aptitude で入れておく、其々本体はもう入ってるんだよね。
http://www.opscode.com/hosted-chef/HostedChef でユーザ登録、オーガニゼーション名に困ったり。
validation key Knife configuration file private_key が何処から取れるのか分かりにくい。
GitHub - chef-boneyard/chef-repo: DEPRECATED: Use of this repository is deprecated. We recommend using the chef generate repo command that comes with ChefDK.のこと。空の Chefリポジトリ。
(0)<ホスト>[189] git clone git://github.com/opscode/chef-repo.git Cloning into chef-repo... remote: Counting objects: 199, done. remote: Compressing objects: 100% (119/119), done. remote: Total 199 (delta 71), reused 161 (delta 47) Receiving objects: 100% (199/199), 30.28 KiB, done. Resolving deltas: 100% (71/71), done. [~/projects] <pts/1>
- .chefディレクトリ作って上記キーファイル類を配置
- knife cookbook site vendor chef-client
- Cookbook chef-client version 1.1.0 successfully installed
- cookbooks/chef-client以下にいろいろ
- knife cookbook upload chef-client
- Uploading chef-client [1.1.0]
- upload complete
- Webのマネージメントコンソールで Cookbooks を確認、入ってる
「knife client list」でも出てくる。上記で何かのキーを作る時に登録した名前のクライアント
そして EC2 なんだけど、上記参考リンクではうまくいかない、
knife ec2 server create --run-list 'recipe[chef-client]' --image ami-31814f58 --ssh-key <キーペア> --groups <セキュリティグループ> --ssh-user ec2-user
とかすると EC2インスタンスは作れて、ジェムとかいろいろ入れてくんだけど、ちょっと失敗するのか、chef のノードとしては出てこない。EC2 のマネジメントコンソールには出てくるけど、シェフのマネジメントコンソールの node としては現れない。
本サイトの EC2 Bootstrap Fast Start Guide
/var/lib/gems/1.9.1/gems/knife-ec2-0.5.10/lib/chef/knife/ec2_server_create.rb とかその周辺に bootstrap手順
それで ubuntu はできた、--groups <セキュリティグループ> 注意。
AmazonLinux を -d centos-gems で試してみる、こっちは駄目だ、オプションは受け入れてくれたが chef のインストールに失敗、node にはなれない。
- d archlinux-gems にしてみた、あまり何もしないのに割と全然駄目。オプションはギットから https://github.com/opscode/chef/tree/master/chef/lib/chef/knife/bootstrap
シェフのマネジメントコンソールでノードを Delete しても EC2インスタンスは立ったままだった。ノードリストから消えたけど。再登録どうするんだろとか考える前に AWSマネジメントコンソールからターミネート。クライアントも残るっぽいので別に Delete。
knife ssh サブコマンドの -a オプション、「-a ec2.public_hostname」っていうのはまんま書く、はじめパブリックホストネーム自体を書いてて駄目だった。
ブートストラップのスクリプトを置く場所、探しに行く場所 .chef/bootstrap/以下(bootstrapサブディレクトリ重要)、-d で指定するとき拡張子 .erb はいらない。
https://gist.github.com/1571189 の chef bootstraper for amazon-linux は取敢えず動いた。手元で Ruby1.9.3 に行くように書き換えたり、冒頭「yum -y update」「yum -y install mlocate」書き加えたり。
chef-client
knife ec2 server create -I ami-6936fb00 -x ubuntu --groups <> -r chef-client
デフォルトのディストリビューションは ubuntu なので -d ディストロ指定しなくてもブートストラップまで行く。そして chef-client が入る、「ps aux」するにデーモン稼動してる
root 5908 0.0 1.1 32132 20548 ? S 07:34 0:00 /usr/bin/ruby1.8 /usr/bin/chef-client -d -P /var/run/chef/client.pid -L /var/log/chef/client.log -c /etc/chef/client.rb -i 1800 -s 20
一方 AmazonLinux で上記ブートストラップスクリプト使うと
knife ec2 server create -I ami-1b814f72 -x ec2-user --groups <> -d amazon-linux -r chef-client
chef-client 自体は run_listに入るがデーモン的実行はない。コマンドラインで実行する(sudo が必要で、そうすると /usr/local/bin のパス指定も要る)、
[Could not determine service init style, manual intervention required to start up the chef-client service.] action write (chef-client::service line 241)
とか言われる。デーモン実行自体は出来る、ubuntu のときと同じオプションで実行する。まあ手でデーモン実行するかな。上記 amazon-linux ブートストラップに書くのはあんまりだよね。
chef-client のレシピはマルチプラットフォーム対応しようとしててちょっと見にくいかも。
cookbooks/chef-client
- chef-client/attributes/default.rb
- パスとか上記オプション値とかの初期設定、プラットフォーム選択あり
- chef-client/recipes/service.rb
- このなかでサービスを起動してる、Could not determine service のエラーメッセージもここで(最後の else) 作ってるみたい
レシピの実際
マルチプラッとフォーム対応とか、リソース間の依存関係(あれをやってそれがおわったらこれをして、みたいな)とか考えなければ結構なんとかなる感じ。http://wiki.opscode.com/display/chef/Resources#Resources-Directory にリソース(レシピで実行する事)のリストがあるのでそれを見ながらなんとか。