test1. 1
平成 23 年度 研究レポート課題
サーバの構築作業や運用管理を自動化する
「Chef」を使うためのチュートリアル
サービスディベロップメントグループ
並河 祐貴
2011 年 8 月 31 日
7. 7
cookbooks/
|-- attributes
|-- definitions
|-- files
|-- libraries
|-- metadata.rb
|-- providers
|-- recipes
|-- resources
`-- templates
この中で基本となる部分は、recipes、templates、atteributesの3つである。
それぞれについて以下で説明する。
recipesは、システムのあるべき姿、つまり設定内容を実際に記載したRubyス
クリプトである。例えば、Apacheのパッケージをインストールしたい場合は、
以下のようにrecipeに記述する。
package "apache2" do
action :install
end
また、あわせて以下のように記載すると、自動起動が有効になっているか、
およびサービスが起動しているかどうかの確認も行うよう設定される。(設定が
有効になっていない場合は有効に、サービスが起動していない場合は、サービ
スを起動することが可能。)
service "apache2" do
action [ :enable, :start ]
end
次に、templatesは、ERB形式で記述可能な、実際にサーバへ配置する設定フ
ァイルのテンプレートである。動的にパラメータを変更したい箇所など、各サ
ーバで、Chefを実行した際に、実際にそのサーバの役割にあった設定値をあて
はめる場合などで利用する。そこで、Chefでは、この実際にあてはめる設定値(パ
9. 9
第3章 セットアップ方法
本章では、実際にChefが動く環境のセットアップ方法について記す。ここで
は、クライアント・サーバともにLinux(CentOS 5系)での構築を前提として、説
明を進める。
■ クライアント編
ChefはRuby製のため、まずRubyのインストールが必要となる。尚、CentOS 5
系では、パッケージ管理されているRubyのバージョンが古いため、外部リポジ
トリからのインストールを以下の手順で行う。
# wget -O /etc/yum.repos.d/aegis.repo http://rpm.aegisco.com/aegisco/el5/ae
gisco.repo
# yum install ruby-1.8.7.334-2.el5 ruby-devel-1.8.7.334-2.el5 ruby-ri-1.8.7.33
4-2.el5 ruby-rdoc-1.8.7.334-2.el5 ruby-static-1.8.7.334-2.el5 rubygems
次に、Chefのインストールを行う。今回利用したChefのバージョンは0.9.18
となる。
# gem install chef -v 0.9.18
その後、以下の手順でバージョン情報が表示されると、クライアントのイン
ストールは無事完了となる。
# chef-client -v
Chef: 0.9.18
■ サーバ編
まずは、先ほど記したクライアント編のセットアップと同じ手順を実施し、
chef-clientが実行できることを確認する。
次に、以下の手順で外部リポジトリから必要なパッケージをインストールす
10. 10
る。
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release
-5-4.noarch.rpm
# yum install ruby-shadow gcc gcc-c++ couchdb erlang rabbitmq-server jav
a libxml2-devel zlib-devel sqlite-devel
chef-Serverのバックエンドで必要となるCouchDBとRabbitMQを起動する。
# /etc/init.d/couchdb start
# /etc/init.d/rabbitmq-server start
RabbitMQをChefで使う設定を行う。
# rabbitmqctl add_vhost /chef
# rabbitmqctl add_user chef testing
# rabbitmqctl set_permissions -p /chef chef ".*" ".*" ".*"
chef-serverや、merb、chef-serverとの連携で利用するアダプタ等のインス
トールを行う。
# gem install chef-server -v 0.9.18
# gem install merb
# gem install sqlite3-ruby -v 1.2.5
尚、CentOS 5系でインストールできるsqliteのバージョンが古いため、
sqlite3-rubyパッケージだけはバージョンを指定する形でインストールを行う。
次に、JAVA_HOMEの環境変数およびPATHを通した後、chef-solr-indexerと、
chef-solrを起動する。
# export JAVA_HOME=/usr
# export PATH=$JAVA_HOME/bin:$PATH
# chef-solr-indexer &
# chef-solr &
12. 12
solr_jetty_path File.join(supportdir, "solr", "jetty")
solr_data_path File.join(supportdir, "solr", "data")
solr_home_path File.join(supportdir, "solr", "home")
solr_heap_size "256M"
umask 0022
Mixlib::Log::Formatter.show_time = false
最後に、chef-serverおよび、chef-serverのAPIにGUIでアクセス可能となる
chef-server-webuiを起動する。これらも必要に応じて、起動/停止スクリプト
を作っておくと良い。
# chef-server -N -e production
# chef-server-webui -p 4040 -e production
起動後、ブラウザで「http://(chef-serverのIPアドレス):4040」にアクセス
すると図2のログイン画面が表示される。
図2: chef-server-webui のログイン画面
ブラウザから、ユーザ名とパスワードを"/etc/chef/server.rb"の
"web_ui_admin_user_name"と"web_ui_admin_default_password"で設定したも
13. 13
の( サンプルでは admin / somerandompasswordhere )を入力してログインする。
画面遷移した後、パスワードの変更が求められるとログインは成功となる。
■ ChefクライアントからChefサーバへのアクセス
まず、Chefサーバ内のファイル"/etc/chef/validation.pem"をChefクライア
ントの"/etc/chef"配下にscpコマンド等でコピーする。次に、Chefクライアン
トの"/etc/chef"配下に、"client.rb"というファイル名で、以下の内容を記述
する。
chef_server_url 'http://xxx.xxx.xxx.xxx:4000'
node_name 'chef-test01'
"chef_server_url"のxxx.xxx.xxx.xxxには、ChefサーバのIPアドレスを記述
する。また、"node_name"は任意の文字列を入力する。"node_name"はわかりや
すくホスト名などを付けると良い。今回はサンプルとしてchef-test01としてい
る。
次に、以下のコマンドを実行し、Chefサーバへアクセスする。
$ sudo chef-client
実行後、特にエラーも表示されず実行されていれば処理は成功となる。この
段階で、上記コマンドを実行したChefクライアントの情報が登録され、
"/etc/chef/"配下に"client.pem"という鍵ファイルが配置され、サーバに情報
が登録される。
■ knifeコマンドのセットアップ
knifeコマンドは、Chefサーバにアクセスするクライアントソフトウェアの1
つで、コマンドラインから様々な操作を実行することが可能である。尚、knife
コマンドはchefに同梱されている。
knifeコマンドのセットアップは、まず以下のコマンドを実行し、knifeコマ
ンドの初期設定を行う。
14. 14
$ sudo knife configure
"knife configure"では、設定項目について以下のようにインタラクテイブに
入力する。
Where should I put the config file? [~/.chef/knife.rb]
Please enter the chef server URL: [http://localhost:4000] http://xxx.xxx.xxx.x
xx:4000
Please enter an existing username or clientname for the API: [username]
chef-test01
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):
上記、2つ目の質問では、chefサーバのURL(IPアドレス:4000番ポート)を、3
つ目の質問では、chefクライアントのnode name(今回のサンプルでは
chef-test01)を、残りは基本的にデフォルトのまま(Enterを押すのみ)で問題な
い。
次に、以下のコマンドを実行し、先ほどchef-clientコマンドを実行した際に
発行された"client.pem"ファイルへのアクセスを有効にする。
$ sudo chmod 644 /etc/chef/client.pem
$ ln -s /etc/chef/client.pem ~/.chef/chef-test01.pem
ここまででknifeコマンドに関する最低限の設定は完了となる。次のコマンド
を実行し、登録済のnode(Chefクライアント)名が表示されれば、動作確認は完
了となる。
$ knife node list
[
"chef-test01"
]
15. 15
第4章 Chef を使いこなすための第一歩
本章では、Chefを利用するためにまず覚える事項をチュートリアル形式で記
す。
■ Chefのディレクトリ一式を作成する
Chefに触れる上で、最初にやる事は、Chefのディレクトリ一式を作成するこ
とである。Chefの設定は、どのマシンで行っても良いが、今回はChefクライア
ントのマシンで設定を行う。
まずは、Chefクライアントのマシンの任意のワーキングディレクトリ(ここで
はサンプルとして、ホームディレクトリ配下とする)で、以下のコマンドを実行
する。
$ cd ~
$ wget --no-check-certificate -O ./chef-repo.tar.gz http://github.com/opscode/c
hef-repo/tarball/master
$ tar zxvf chef-repo.tar.gz
$ mv opscode-chef-repo-xxxxxx chef-repo
流れとしては、opscode(Chefの開発元)のgithubから、Chefのディレクトリ一
式(雛形)が入ったファイルをダウンロードした後に展開する。ここでは、サン
プルとして、そのディレクトリ一式をchef-repoとする。
■ Cookbookを作る
まず、Cookbookの雛形となるディレクトリをknifeコマンドで作成する。
今回は、サンプルとしてsampleという名前のCookbookを以下のコマンドで作成
する。
$ knife cookbook create sample -o ~/chef-repo/cookbooks
"~/chef-repo/cookbooks/sample"にCookbookの雛形となるディレクトリが作
成されていれば成功となる。
17. 17
まず、"~/chef-repo/cookbooks/sample/recipes/default.rb"ファイルを開き、
以下の内容を記述し、保存する。
template "/tmp/chef-sample.txt" do
source "chef-sample.txt.erb"
mode 0644
end
次に、システム情報を出力するファイルのテンプレートとして、
"~/chef-repo/cookbooks/sample/templates/default/chef-sample.txt.erb"フ
ァイルを以下の内容で作成する。
Welcome to Chef!
CPU : <%= node[:cpu][:"0"][:model_name] %>
Memory: <%= node[:memory][:total] %>
OS : <%= node[:platform] %> <%= node[:platform_version] %>
簡単な例ではあるが、これでRecipeとTemplateの記述が完了となる。
■ Chefサーバへの登録
作成したCookbook(RecipeやTemplateを含んだもの)をChefサーバへ登録する。
Chefサーバへの登録は、以下のknifeコマンドを実行する。
$ knife cookbook upload -a -o ~/chef-repo/cookbooks/
"-a"オプションを付けると、指定ディレクトリ配下のCookbook全てをアップ
ロードすることが可能となる。Cookbookのアップロード後、以下のコマンドを
実行することで、登録されたCookbookを確認できる。
$ knife cookbook list
[
"sample"
]
18. 18
次に、先ほど作ったCookbook(sample)を適用するため、以下のコマンドを実
行し、node(Chefクライアントに)に紐付ける。
$ knife node run_list add chef-test01 'recipe[sample]'
chef-test01は今回利用しているnode(Chefクライアント)名であり、引数の最
後に'recipe[Cookbook名]'を記述している。
■ chefを実行して反映する
Chefクライアントのコンソールで以下のコマンドを実行して、Cookbookで設
定した内容を反映する。
$ sudo chef-client
エラーも無く無事に完了した場合、実際に配置されたテキストファイルを以
下コマンドで確認すると、chef-clientコマンドを実行したChefクライアントの
システム情報が表示されている。
$ cat /tmp/chef-sample.txt
Welcome to Chef!
CPU : Intel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz
Memory: 4005864kB
OS : centos 5.4
■ Attributeを使う
Attributeは、Templateなどで実際に利用する設定値を格納する器のことで、
Cookbookでデフォルト値を定義したり、Role(nodeを"Webサーバ"などでグルー
ピングしたい場合に利用)での共通の設定値、またnodeごとに設定値を定義でき
る。
20. 20
Memory: 4005864kB
OS : centos 5.4
Memo : None.
最後に、先ほどのデフォルト値を設定したまま、NodeのAttributeを設定する。
knifeコマンドでNodeのAttributeを編集する場合は、以下のコマンドを実行す
る。
$ EDITOR=vi knife node edit chef-test01
"EDITOR=vi"の部分は、好みのエディタを指定することが可能である。上記コ
マンドを実行すると、エディタでNodeのAttributeが編集できる。Attributeは
JSON形式になっており、以下のように、"normal"のkeyのvalueの中に、サンプ
ルとして「"memo": "test chef-node."」を入力する。
{
"normal": {
"tags": [
],
"memo": "This is a chef-node."
},
"name": "chef-test01",
"override": {
},
"default": {
"memo": "None."
},
・・・・・以下省略・・・・・
エディタを保存して終了すると、"Saved node[chef-test01]"と標準出力され、
Attributeの設定が完了する。
その後、これまでと同様の手順で、Cookbookをアップロードした後、
chef-clientコマンドを実行する。その後、配置されたファイルを確認すると、