話題の記事

Chef を始める #1 – 概要、Chef Server を EC2 上にインストール、Workstation の設定まで

2013.04.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーバー構築をプログラミングする

chef0

最近、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つの構成要素から成り立ちます。

overview_chef_draft

Chef Server

Nodeの管理、Cookbook、Recipe情報などの構成管理を行います。 WEB上から操作できます。

Workstation

Knife コマンドで、Cookbook や Recipeを 操作したり、Chef Server に支持をしたりする環境です。

Node

Chef Server が管理するマシンです。
Chef Server で管理している Cookbook や Recipe 情報を Node 上の Chef Client が取得して、そのタスクを実行します。


今回の構成イメージに置き換えると、以下のような感じ。

chef5

今回は、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画面が表示されるはずです。

chef1

画面右のユーザ名とパスワードでログインすると、パスワードの変更画面が表示されるので、適宜変更します。

chef2

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です!

chef6

knife コマンドでも登録されたことが確認できます。

$ knife user list
admin
yamato

まとめ

今回は、Chef Server のインストールと Workstation の設定までを行いました。
環境構築のみだったので、イメージが湧きにくい部分があったと思います。
次回からは、実際にどんな風に Cookbook を作って、Node に適用させるかを試していきたいと思います。