Chef と AWS

Chef で AWS

まずは Chef で AWS 、下記を参考に

あと

取敢えず Debian 6.0.4 squeeze をインストールする。Rubyruby1.9.1-full パッケージで 1.9.2、コマンド類は ruby1.9.1 とかバージョン数字付きなので、ないのシンボリックリンク作る(update-alternatives --query rubyruby の登録はない)。
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>
  1. .chefディレクトリ作って上記キーファイル類を配置
  2. knife cookbook site vendor chef-client
    • Cookbook chef-client version 1.1.0 successfully installed
    • cookbooks/chef-client以下にいろいろ
  3. 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 にはなれない。

シェフのマネジメントコンソールでノードを 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 にリソース(レシピで実行する事)のリストがあるのでそれを見ながらなんとか。