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

インスタンスを立ち上げるアベイラビリティーゾーンを指定

立ち上げるインスタンスに指定する鍵

  • image

使用するAMI

  • flavor

インスタンスのタイプ

  • groups

セキュリティーグループ。複数の場合はカンマ区切りで

  • tags

タグの指定。複数の場合はカンマ区切りで

  • node-name

Chef Serverに登録するNodeの名前

インスタンス起動後にプラグインが立ち上げたインスタンス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を使って起動したサーバに設定を反映させる方法について説明したいと思います。