Chef を始める #1 – 概要、Chef Server を EC2 上にインストール、Workstation の設定まで
サーバー構築をプログラミングする
最近、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 に適用させるかを試していきたいと思います。