サーバー構築自動化ツール Chef 最新版のインストール方法メモ。
2013年2月頃にリリースされたバージョン11とそれ以前のバージョンとでは、インストール方法にかなりの違いがあるのでご注意ください。
以前のバージョンよりは簡単にインストールできるようになったみたいですが、それでもそれなりに面倒な手順が必要です…。
用語解説
独特の用語がかなり多く、知っていないと混乱するので、最初に用語を説明します。
chef
サーバー構築自動化ツール。同じ構成のサーバーを複数台用意するときに使う。設定ファイルを書き換えるだけで複数台のサーバーの構成を同時に変更することができる。
chef server
サーバー構成の設定ファイルを管理するもの。各chef clientからアクセスされるもの。
chef client
chef serverにアクセスするもの。chef clientの例として、管理ツールのknife、管理用のWeb UI、構成を管理されている各サーバー(にインストールされているchef client)、がある。
knife
chefに関する作業の大半を行うためのコマンド。代表的な使い方としては、client作成、user作成、設定ファイル作成、などがある。最初にknifeのための設定を行わないと使えない。
workstation
chef公式ドキュメントにはでてくるけど自分で作業するときには全く使わない用語。knifeの設定を終えていて、chefリポジトリと同期(synchronize)していて、単体のchef serverとして動くコンピューターのこと。
chef repository
cookbook、role等のデータが保存される場所。通常はworkstation上、つまりchef server上に保存される。
node
chefで構成を管理されているサーバー。各nodeにインストールされたchef clientが、chef serverから設定ファイルを取得し、自分自身(node)にその設定を適用する。
knife configure -i
knifeを使うための初期設定を行うためのコマンド。knife.rbを作成する。
knife configure client [tmp directory]
各client用の設定ファイルを作成するコマンド。指定したディレクトリに、client.rb、validation.pemを作成する。この2つのファイルを使って、各nodeの設定を行う。
cookbook
chefで行いたい設定の手順を記述したもの。環境に依存しないものを書く。環境に依存するものはroleやnodeのattributesに書く。
recipe
設定を記述したrubyスクリプト。1つのcookbookは複数のrecipeを持つことができる。
role
サーバーの役割を記述したもの。どのrecipeを使うのかを書く。各サーバーはrole経由でrecipeを持つが、roleを介さないでrecipeを持つこともできる。
attributes
設定したい値のこと。cookbook、recipeには環境依存の値を持たせず、環境依存の値は全てattributesに書いておく。attributesはrubyのhashそのもの。recipe自体やrecipe経由のtemplateから使われる。
attributesはrecipe、role、nodeに書ける。recipeに書いたattributesがそのrecipeのデフォルト値になって、それをroleやnodeのattributesで上書きする、という使い方。
templates
まだよく分かっていません。
参考リンク
chef serverのインストールと初期設定
Red Hat Enterprise Linux6、x86_64構成でのrpmは下記の通りです。自分のサーバー構成に合ったrpmはchef公式パッケージダウンロードページから選んでください。
$ wget https://opscode-omnitruck-release.s3.amazonaws.com/el/6/x86_64/chef-server-11.0.6-1.el6.x86_64.rpm $ rpm -ivh chef-server-11.0.6-1.el6.x86_64.rpm $ chef-server-ctl reconfigure
ここからはchef clientのコマンド類のインストールです。clientという名前ですがchef serverでも必要です。knifeコマンド等がインストールされます。
$ curl -L https://www.opscode.com/chef/install.sh | bash
ここからはknifeの初期設定です。knifeの初期設定を行うことで、client、user、nodeが追加できるようになります。
$ cp /etc/chef-server/admin.pem /etc/chef/ $ cp /etc/chef-server/chef-validator.pem /etc/chef/validation.pem $ knife configure -i Where should I put the config file? [/root/.chef/knife.rb] Please enter the chef server URL: [http://ip-10-150-169-25.ap-northeast-1.compute.internal:4000] https://server.domain:443 Please enter a name for the new user: [root] Please enter the existing admin name: [admin] Please enter the location of the existing admin's private key: [/etc/chef/admin.pem] Please enter the validation clientname: [chef-validator] Please enter the location of the validation key: [/etc/chef/validation.pem] Please enter the path to a chef repository (or leave blank): Creating initial API user... Please enter a password for the new user:
基本的にはEnterを押していくだけなんですが、server URLだけは正しい値を入力してください。httpsでポート番号は443な点に注意です。サンプル値は4000になってますが、4000なのは以前のバージョンです。
ここまで成功していると、下記のコマンドが使えるようになっています。下記のコマンドがエラーなく実行できていれば、chef serverのインストールは成功です。
$ knife user list $ knife client list
参考リンク
chef clientのインストールと初期設定
この手順は、chef serverを使うために必須ではありません。何らかの理由でchef clientを単体でインストールするとき用の手順です。
chef clientをインストールしたいサーバーで下記のコマンドを実行してください。
$ curl -L https://www.opscode.com/chef/install.sh | bash
clientに設置する秘密鍵を作成するために、chef serverをインストールしたサーバーで下記コマンドを実行してください。
$ knife client create [new client name] # 標準出力に表示された秘密鍵は下記のファイル名で保存してください。 # 場所はどこでもOKです。 [new client name].pem
作成した[new client name].pem、chef server上の/etc/chef-server/admin.pem、/etc/chef-server/chef-validator.pemを、chef clientをインストールするサーバーに下記のパスで保存してください。
~/.chef/[new client name].pem /etc/chef/admin.pem /etc/chef/validation.pem # このファイルだけファイル名を変えます
chef clientをインストールするパソコンで下記のコマンドを実行してください。
chef serverにchef clientをインストールしたときと同じ内容ですが、~/.chef/[new client name].pemが自動的に読み込まれて、chef serverへchef clientを登録することになります。
$ knife configure -i Where should I put the config file? [/root/.chef/knife.rb] Please enter the chef server URL: [http://ip-10-150-169-25.ap-northeast-1.compute.internal:4000] https://server.domain:443 Please enter a name for the new user: [root] Please enter the existing admin name: [admin] Please enter the location of the existing admin's private key: [/etc/chef/admin.pem] Please enter the validation clientname: [chef-validator] Please enter the location of the validation key: [/etc/chef/validation.pem] Please enter the path to a chef repository (or leave blank): Creating initial API user... Please enter a password for the new user:
chef clientのインストールを確認するために、chef client、chef serverで下記のコマンドを実行してください。
chef client上で実行するコマンド
# 下記のようなエラーがでれば成功です。追加したclientは管理権限のないclientなので、認証は成功するけど一覧の表示はできない、というエラーになります。 $ knife client list ERROR: You authenticated successfully to https://server.domain:443 as [new client name] but you are not authorized for this action
chef server上で実行するコマンド
# chef server上ではエラーなく一覧が表示されます。一覧に含まれていればchef clientの追加成功です。 $ knife client list
chef serverが管理するnodeを追加する
nodeとして追加したいサーバーで下記のコマンドを実行してください。
$ curl -L https://www.opscode.com/chef/install.sh | bash
nodeに設置するclient.rbを作成するために、chef serverをインストールしたサーバーで下記コマンドを実行してください。
$ knife configure client [設定ファイルを一時的に保存するディレクトリ] # 指定したディレクトリに下記ファイルが作成されます client.rb validation.pem
作成された2つのファイルを、nodeとして管理したいサーバーに下記のパスで設置してください。
/etc/chef/client.rb /etc/chef/validation.pem
このnode上で、下記のコマンドを実行してください。エラーがでなければOKです。
$ chef-client
最後に、chef server上で、下記のコマンドを実行してください。追加したnodeが一覧に表示されれば、nodeの追加完了です。
$ knife node list
nodeの追加をする一番簡単な方法は本来下記のコマンドなのですが、EC2上のEnterprise LinuxではPrivate IPを使ってしまう問題で正しく追加できませんでした。
$ knife bootstrap [FQDN] -x [user name] -i [ログインに必要な秘密鍵] --sudo -N [node name]
参考リンク
cookbookの作成
疲れたのでまた今度。
まとめ
自前のサーバーを数十台以上持っているならchefを使うことで楽になるかもですが、EC2サーバーで同じ事をするなら、インスタンスのスナップショットをコピーしてサーバーを増やす方がはるかに簡単だと思いました…。