この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
サーバー構築をプログラミングする
最近、Chef(シェフ)
自分はインフラエンジニアでもないですが、プログラミング感覚でサーバー構築ができて、これがなかなか面白いです。
Chef って?
サーバーの構成管理ツールです。Ruby で記述することができます。
構築の手順をマニュアル化してメンテしていくのは大変だし、やはり手動で構築すると、設定ミスは防ぎきれません。
Chef を使って、一度その設定をコードで書いてしまえば、そのコードを保存しておいて、全く同じ手順で他のサーバに構築できますし、
各環境ごとに必要なパラメータを変更して構築することも簡単です!
Cookbook や Recipe を Knife を使って操作する
Recipe は、サーバー情報設定の基本単位で、Ruby の DSL で記述します。
複数の Recipe やテンプレート、属性等のまとまりを Cookbook と呼びます。
Knife はコマンドラインツールで、Cookbook や Recipe を操作したり、Chef Server とのインターフェースを提供します。
多くの Cookbook が用意されている
Opscode(Chefを提供している会社)の github 上で既に多くの Cookbook が提供されています。
https://github.com/opscode-cookbooks/
apache、nginx、git、zsh、memcached、windows、java、unicorn、jenkins、hadoop...
Cookbook は自分で一から作ることができますが、最初はこれらの Cookboook を元に色々試すのがいいかなと思います。
Chef を構成する3つの要素
Chef は、Chef Server、Workstation、Node の3つの構成要素から成り立ちます。
Chef Server
Nodeの管理、Cookbook、Recipe情報などの構成管理を行います。 WEB上から操作できます。
Workstation
Knife コマンドで、Cookbook や Recipeを 操作したり、Chef Server に支持をしたりする環境です。
Node
Chef Server が管理するマシンです。
Chef Server で管理している Cookbook や Recipe 情報を Node 上の Chef Client が取得して、そのタスクを実行します。
今回の構成イメージに置き換えると、以下のような感じ。
今回は、Chef Server のインストールから Workstation の設定までやっていきます。
Chef Server のインストール
事前準備
OSは、Amazon Linux を選択。(small インスタンス以上がいいです。理由は後述。)
セキュリティグループで、ssh、http、https を開放します。
インストール
最新バージョンは、11.0.6 なのでこれをインストールします。
http://www.opscode.com/chef/install/
$ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-server-11.0.6-1.el6.x86_64.rpm
$ sudo rpm -ivh chef-server-11.0.6-1.el6.x86_64.rpm
Chef Server の設定
設定のコマンドを実行する前に幾つかすることがあります。
hosts ファイルに EC2 の Private IP と Public DNS 名を指定。
$ sudo vim /etc/hosts
127.0.0.1 localhost localhost.localdomain
10.XXX.XXX.XXX ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
HOSTNAME に Public DNS 名を指定。
$ sudo vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6INIT=no
IPV6_ROUTER=no
IPV6_AUTOCONF=no
IPV6FORWARDING=no
IPV6TO4INIT=no
IPV6_CONTROL_RADVD=no
$ sudo /etc/init.d/network reload
現在の hostname を変更。
$ sudo hostname ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
上記の設定を行なっても、まだ上手くいきません。
何故なら、設定のレシピが Amazon Linux に対応していないためですw
Amazon Linux でインストールするために、Recipe を以下のように書き換えました。
$ sudo vim /opt/chef-server/embedded/cookbooks/runit/recipes/default.rb
case node["platform"]
when "ubuntu"
include_recipe "runit::upstart"
when "redhat","centos","rhel","scientific"
if node['platform_version'] =~ /^6/
include_recipe "runit::upstart"
else
include_recipe "runit::sysvinit"
end
when "amazon"
include_recipe "runit::upstart"
else
include_recipe "runit::sysvinit"
end
※ Amazon Linuxは、2011.02 のバージョンから sysvinit から upstart に変わってますので、upstart の recipe を実行するように指定しました。
http://aws.amazon.com/jp/amazon-linux-ami/2011.02-release-notes/
上記まで済んだら、Chef Server の設定コマンドを実行します。
$ sudo chef-server-ctl reconfigure
Chef Client finished, 246 resources updated
chef-server Reconfigured!
ちなみに Micro インスタンスだと、メモリ不足になってしまったので、small インスタンスを使用してます。
[2013-04-08T00:51:30+00:00] FATAL: Stacktrace dumped to /opt/chef-server/embedded/cookbooks/cache/chef-stacktrace.out
[2013-04-08T00:51:30+00:00] FATAL: Errno::ENOMEM: Cannot allocate memory - fork(2)
Chef Server にアクセスする
構築したEC2のサーバーにアクセスすると、Chef Server のWEB画面が表示されるはずです。
画面右のユーザ名とパスワードでログインすると、パスワードの変更画面が表示されるので、適宜変更します。
Workstation の設定
Workstation の設定の前に、Chef Server 上の必要なファイルを scp コマンドから取得できる場所に移動しておきます。
$ cd /etc/chef-server/
$ sudo cp admin.pem chef-validator.pem /home/ec2-user
$ cd /home/ec2-user
$ sudo chmod +r admin.pem chef-validator.pem
次に Workstation を設定したいマシン上で、chef repository のクローンと、鍵のコピー、空の knife.rb を作成します。
$ mkdir ~/chef
$ cd ~/chef
$ git clone https://github.com/opscode/chef-repo.git
$ cd chef-repo
$ mkdir .chef
$ cd .chef
$ scp -i ~/blog.pem ec2-user@ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com:/home/ec2-user/admin.pem .
$ scp -i ~/blog.pem ec2-user@ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com:/home/ec2-user/chef-validator.pem .
$ touch knife.rb
Knife コマンドを実行するために、chef の gem をインストールしておきます。(Ruby は 2.0.0-p0で試しました)
$ gem install chef --no-ri --no-rdoc
knife configure で Chef Server の情報を元に初期設定を行います。
$ knife configure -i
Overwrite /Users/yamato/Documents/chef/chef-repo/.chef/knife.rb? (Y/N) Y
Please enter the chef server URL: [http://yamato-no-MacBook-Air.local:4000] https://ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com/
Please enter a name for the new user: [yamato]
Please enter the existing admin name: [admin]
Please enter the location of the existing admin's private key: [/etc/chef/admin.pem] /Users/yamato/Documents/chef/chef-repo/.chef/admin.pem
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem] /Users/yamato/Documents/chef/chef-repo/.chef/chef-validator.pem
Please enter the path to a chef repository (or leave blank):
Creating initial API user...
Please enter a password for the new user:
Created user[yamato]
Configuration file written to /Users/yamato/Documents/chef/chef-repo/.chef/knife.rb
登録したユーザー名とパスワードでログインできれば、設定OKです!
knife コマンドでも登録されたことが確認できます。
$ knife user list
admin
yamato
まとめ
今回は、Chef Server のインストールと Workstation の設定までを行いました。
環境構築のみだったので、イメージが湧きにくい部分があったと思います。
次回からは、実際にどんな風に Cookbook を作って、Node に適用させるかを試していきたいと思います。