Chefを使ってみる
最近話題のChefを使う機会があったのでとりあえずメモっておく。
「Facebook、データセンター自動化ツールにChefの新バージョンを全面採用」
今回はAWSを使って、Chefサーバを立てて実験してみます。
本家サイトに一部が翻訳されたものが置いてあるので、アーキテクチャとか細かい説明はそちらを一度読むといいかと思います。
http://wiki.opscode.com/pages/viewpage.action?pageId=24019624
Chefはサーバを構築するのが大変だからと書かれてますが、ubuntuであればインストールは簡単なので、今回の説明ではubuntuを使って解説していきたいと思います。
AWSのマネージメントコンソールからChefサーバをインストールするインスタンスをたちあげて作業を進めます。
今回利用したAMIは、Amazonga用意してくれている
Ubuntu Server 12.04.1 LTS (64bit)
(ami-9763e696)
を使って行なっています
Chef Serverのインストール
手順は本家サイトでも書かれてます。
http://wiki.opscode.com/display/chef/Installing+Chef+Server+on+Debian+or+Ubuntu+using+Packages
と言っても、ここでも少し説明していきます。
echo "deb http://apt.opscode.com/ precise-0.10 main" | sudo tee /etc/apt/sources.list.d/opscode.list sudo mkdir -p /etc/apt/trusted.gpg.d gpg --keyserver keys.gnupg.net --recv-keys 83EF826A gpg --export packages@opscode.com | sudo tee /etc/apt/trusted.gpg.d/opscode-keyring.gpg > /dev/null sudo apt-get update sudo apt-get install opscode-keyring sudo apt-get upgrade sudo apt-get install chef chef-server
これで、Chefのサーバと、Chef-client、knifeといったものがインストールされます。
最後に「sudo apt-get install chef chef-server」を実行している途中で、以下の様な画面が表示されます。
ここで入力するのは、chefサーバのAPIを操作するためのURLです。
今実行しているサーバから見てのurlなので、「http://localhost:4000」と入力します。
knifeの設定
次に、knifeと呼ばれるchefを操作するためのツール(クライアントの一つ)の設定をします。
まずは、今後使用するファイルを配置する
mkdir -p ~/.chef sudo cp /etc/chef/validation.pem /etc/chef/webui.pem ~/.chef sudo chown -R $USER ~/.chef
configureコマンドを実行すると、対話式で入力が求められるので、適宜値を指定していきます。
$ sudo knife configure -i WARNING: No knife configuration file found Where should I put the config file? [/home/ubuntu/.chef/knife.rb] ←このままEnter Please enter the chef server URL: [http://hoge.com:4000] http://localhost:4000 Please enter a clientname for the new client: [ubuntu] chefuser ←今回は「chefuser」とした Please enter the existing admin clientname: [chef-webui] ←このままEnter Please enter the location of the existing admin client's private key: [/etc/chef/webui.pem] /home/ubuntu/.chef/webui.pem Please enter the validation clientname: [chef-validator] ←このままEnter Please enter the location of the validation key: [/etc/chef/validation.pem] /home/ubuntu/.chef/validation.pem Please enter the path to a chef repository (or leave blank): Creating initial API user... Created client[chefuser] Configuration file written to /home/ubuntu/.chef/knife.rb
正しく設定されると以下のコマンドを入力することで、chefサーバに登録されたclientが表示されます。
$ knife client list chef-validator chef-webui chefuser
これで、Chefサーバのインストールが完了しました。
これからChefサーバを使って様々なセットアップを行うのですが、対象となるサーバ(ノード)をknifeを使って起動してみます。
knife-ec2
opscodeのgithubに公開されているknife用のプラグイン「knife-ec2」を使います
https://github.com/opscode/knife-ec2
インストール自体はgemで出来ます。
sudo gem install knife-ec2
以下の様なエラーが表示された場合は、自前にいくつかのライブラリのインストールが必要となります。
$ sudo gem install knife-ec2 Fetching: builder-3.2.0.gem (100%) Fetching: excon-0.19.3.gem (100%) Fetching: formatador-0.2.4.gem (100%) Fetching: multi_json-1.6.1.gem (100%) Fetching: mime-types-1.21.gem (100%) Fetching: net-ssh-2.6.5.gem (100%) Fetching: net-scp-1.0.4.gem (100%) Fetching: nokogiri-1.5.6.gem (100%) Building native extensions. This could take a while... ERROR: Error installing knife-ec2: ERROR: Failed to build gem native extension. /usr/bin/ruby1.8 extconf.rb checking for libxml/parser.h... no ----- libxml2 is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies. ----- *** extconf.rb failed ***
その場合は、メッセージに書かれているサイトを参考にインストールを済ませます。
sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby sudo apt-get install libxslt-dev libxml2-dev sudo gem install nokogiri
あらためて、knife-ec2をインストール
sudo gem install knife-ec2
無事インストールが済むと、knife-ec2コマンドが使えるようになります。
$ knife ec2 server create --help knife ec2 server create (options)
server createコマンドで、EC2のインスタンスを起動することができるので、実際にやってみます。
knife ec2 server create \ --verbose \ --server-url=http://chef-server.com:4000 \ --region=ap-northeast-1 \ --availability-zone=ap-northeast-1a \ --aws-access-key-id=AWS_ACCESS_KEY \ --aws-secret-access-key=AWS_SECRET_KEY \ --ssh-user=ubuntu \ --ssh-key=MY_KEY \ --image=ami-hogehoge \ --flavor=t1.micro \ --groups=default \ --tags=Name=chefnode \ --node-name=chefnode \ --identity-file=/home/ubuntu/.ssh/MY_KEY.pem
長いw
いくつか解説すると
- server-url
Chef ServerのURL
- region
インスタンスを立ち上げるリージョンを指定
- availability-zone
- ssh-key
立ち上げるインスタンスに指定する鍵
- image
使用するAMI
- flavor
インスタンスのタイプ
- groups
セキュリティーグループ。複数の場合はカンマ区切りで
- tags
タグの指定。複数の場合はカンマ区切りで
- node-name
Chef Serverに登録するNodeの名前
- ssh-user
インスタンス起動後にプラグインが立ち上げたインスタンスにSSHで入る際のユーザー
- identity-file
インスタンス起動後にプラグインが立ち上げたインスタンスにSSHで入る際の鍵
コマンドを実行すると、以下のように長いログが表示されます。
Instance ID: i-fuga Flavor: t1.micro Image: ami-hoge Region: ap-northeast-1 Availability Zone: ap-northeast-1a Security Groups: ichi-default Tags: Namechefnode1 SSH Key: MY_KEY Waiting for server.......................... Public DNS Name: ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Public IP Address: 1.1.1.1 Private DNS Name: ip-1-2-3-4.ap-northeast-1.compute.internal Private IP Address: 1.2.3.4 Waiting for sshd.....done Bootstrapping Chef on ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com --2013-03-02 14:14:41-- http://opscode.com/chef/install.sh ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Resolving opscode.com (opscode.com)... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 184.106.28.83 ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Connecting to opscode.com (opscode.com)|184.106.28.83|:80... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com connected. ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com HTTP request sent, awaiting response... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 301 Moved Permanently ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Location: http://www.opscode.com/chef/install.sh [following] ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com --2013-03-02 14:14:41-- http://www.opscode.com/chef/install.sh ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Resolving www.opscode.com (www.opscode.com)... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 184.106.28.83 ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Reusing existing connection to opscode.com:80. ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com HTTP request sent, awaiting response... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 200 OK ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Length: ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 6470 ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com (6.3K) ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com [application/x-sh] ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Saving to: `STDOUT' ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 0% [ ] 0 --.-K/s ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Downloading Chef 11.4.0 for ubuntu... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 100%[======================================>] 6,470 37.0K/s in 0.2s ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 2013-03-02 14:14:42 (37.0 KB/s) - written to stdout [6470/6470] ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Installing Chef 11.4.0 ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Selecting previously unselected package chef. ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com (Reading database ... (Reading database ... 5%theast-1.compute.amazonaws.com (Reading database ... 10%heast-1.compute.amazonaws.com (Reading database ... 15%heast-1.compute.amazonaws.com (Reading database ... 20%heast-1.compute.amazonaws.com (Reading database ... 25%heast-1.compute.amazonaws.com (Reading database ... 30%heast-1.compute.amazonaws.com (Reading database ... 35%heast-1.compute.amazonaws.com (Reading database ... 40%heast-1.compute.amazonaws.com (Reading database ... 45%heast-1.compute.amazonaws.com (Reading database ... 50%heast-1.compute.amazonaws.com (Reading database ... 55%heast-1.compute.amazonaws.com (Reading database ... 60%heast-1.compute.amazonaws.com (Reading database ... 65%heast-1.compute.amazonaws.com (Reading database ... 70%heast-1.compute.amazonaws.com (Reading database ... 75%heast-1.compute.amazonaws.com (Reading database ... 80%heast-1.compute.amazonaws.com (Reading database ... 85%heast-1.compute.amazonaws.com (Reading database ... 90%heast-1.compute.amazonaws.com (Reading database ... 95%heast-1.compute.amazonaws.com (Reading database ... 100%east-1.compute.amazonaws.com (Reading database ... ortheast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com 47415 files and directories currently installed.) ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Unpacking chef (from .../chef_11.4.0_amd64.deb) ... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Setting up chef (11.4.0-1.ubuntu.11.04) ... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Thank you for installing Chef! ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Processing triggers for initramfs-tools ... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com update-initramfs: Generating /boot/initrd.img-3.2.0-36-virtual ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Starting Chef Client, version 11.4.0 ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Creating a new client identity for chefnode1 using the validator key. ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com resolving cookbooks for run list: [] ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Synchronizing Cookbooks: ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Compiling Cookbooks... ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com [2013-03-02T14:15:25+00:00] WARN: Node chefnode1 has an empty run list. ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Converging 0 resources ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Chef Client finished, 0 resources updated ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Instance ID: i-fuga Flavor: t1.micro Image: ami-hoge Region: ap-northeast-1 Availability Zone: ap-northeast-1a Security Groups: default Security Group Ids: default Tags: Namechefnode1 SSH Key: MY_KEY Root Device Type: ebs Root Volume ID: vol-vol Root Device Name: /dev/sda1 Root Device Delete on Terminate: true Public DNS Name: ec2-1-1-1-1.ap-northeast-1.compute.amazonaws.com Public IP Address: 1.1.1.1 Private DNS Name: ip-1-2-3-4.ap-northeast-1.compute.internal Private IP Address: 1.2.3.4 Environment: _default
ログを見ると分かるように、knife-ec2プラグインはインスタンスを立ち上げると、SSH経由でそのインスタンスにchefクライアントをインストールし、Chef ServerにNodeとClientの情報を登録します。
正常に終了したので、実際にChef Serverに登録されたかを確認します
$ knife node list chefnode1
「chefnode1」 と表示されているので、正常に追加されたのがわかります。
ログの途中で「WARN: Node chefnode1 has an empty run list.」と警告が表示されていますが、今回はChefのcookbook、recipeについて何も触れていません。
次回は、cookbook、recipeを使って起動したサーバに設定を反映させる方法について説明したいと思います。