サーバー設定ツール「Chef」の概要と基礎的な使い方 5ページ

Chefをクライアント/サーバー構成で利用する

 ここまでは、Chefを単一のサーバー内で完結するスタンドアロン構成で利用していたが、クライアント/サーバー構成でChefを利用する方法についても簡単ではあるが紹介しておこう。クライアント/サーバー構成を取る場合、Cookbookなどをサーバー側で集中管理できるのが特徴となる。

Chefサーバーのインストール

 クライアント/サーバー構成でChefを利用する場合、まずChefサーバーを構築する必要がある。Chefサーバー(バージョン11以降)はErlang言語を使って実装されているため、RubyGemsでは配布されていない。そのため、自分でソースコードからビルドするか、Opscodeが配布しているパッケージを利用してインストールすることになる。

 Opscodeが配布しているパッケージは、Opscodeのダウンロードページから入手できる。ただし、対応プラットフォームはRed Hat Enterprise Linux(RHEL) 5/6とUbuntu 10.04~12.10のみで、またx86_64版のみしか用意されていないので注意したい。

 なお、この配布パッケージは/opt/chef以下にChefサーバーやRubyおよびErlangのランタイム環境、そしてPostgreSQL、RabbitMQ、rsync、OpenSSLといったChefサーバーが依存するソフトウェアをすべてインストールするもので、500MB程度の容量が必要となる。また、すでにPostgreSQLやRabbitMQなどがインストールされているサーバーの場合、ポート番号の競合などが発生する可能性があるので注意したい。

 また、Chefサーバーには「example.com」のようなFQDNが必要だ(「example」などの非FQDNなサーバー名では不可)。そのため、ローカルネットワークなどで運用する場合はネットワーク内にDNSサーバーを用意したり、/etc/hostsファイルを利用するなどしてFQDNとIPアドレスの相互変換ができるように設定しておく必要がある。

 /etc/hostsファイルを利用する場合、たとえばホスト名が「centos」なら次のような項目をこのファイルに記述しておけば良い。

<ホストのIPアドレス> centos.<適当なドメイン> centos

 ここで、hostnameコマンドで確認できるホスト名からIPアドレスに変換できるように設定しておく必要がある点に注意したい。

 Opscodeが配布しているパッケージをインストールすると、サーバーの設定や起動/停止/再起動などを行うための「chef-server-ctl」コマンドがインストールされる。パッケージのインストール後は、まず「chef-server-ctl reconfigure」コマンドを実行して設定を行う必要がある。

# chef-server-ctl reconfigure

 また、ChefサーバーとクライアントはTCPの443ポートで通信を行うので、このポートに外部から接続できるようファイアウォールやネットワークの設定をしておこう。

Workstationの設定

 始めに述べたとおり、ChefではChefサーバーの操作を行う端末を「Workstation」と呼ぶ。続いてはこのWorkstationの設定を行っていく。WorkstationはChefサーバーと同じマシンでも構わないが、その場合でも下記の設定は必要となる。

 Workstationで必要なソフトウェアはスタンドアロン構成の場合と同様、chefパッケージに含まれているのでこれをインストールする。

# yum install ruby ruby-devel rubygems make gcc
# gem install chef

 また、Chefサーバーに接続するための証明書なども必要となる。Chefサーバーをインストールしたマシンの/etc/cheef-server以下に証明書が格納されているので、これを以下のようにscpなどでコピーして~/.chef以下に配置しておく。

$ mkdir ~/.chef
$ scp <Chefサーバーのホスト名>:/etc/chef-server/admin.pem ~/.chef/
$ scp <Chefサーバーのホスト名>:/etc/chef-server/chef-validator.pem ~/.chef/

 なお、デフォルトではサーバー側の/etc/chef-server以下のファイルはroot以外読み取りアクセスができないパーミッション設定になっているので、必要に応じてパーミッションを修正するなりしておこう。

 証明書をコピーしたら、クライアント側で「knife configure -i」コマンドを実行して対話式の初期設定を行う。ここではChefサーバーのURLや設定ファイル、Cookbookを格納するディレクトリなどを指定しておく。

$ knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [/home/hylom/.chef/knife.rb]
Please enter the chef server URL: [https://centos02.office.osdn.jp:443] https://example.com:443  ←「https://<ChefサーバーのFQDN>:443」と指定する
Please enter a name for the new user: [hylom]
Please enter the existing admin name: [admin]
Please enter the location of the existing admin's private key: [/etc/chef-server/admin.pem] ~/.chef/admin.pem
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem]  ~/.chef/chef-validator.pem
Please enter the path to a chef repository (or leave blank): ~/chef-repo  ←Cookbookが格納されているディレクトリを入力
Creating initial API user...
Please enter a password for the new user:  ←パスワードを入力
Created user[hylom]
Configuration file written to /home/hylom/.chef/knife.rb

 以上で設定は完了だ。

WorkstationからChefサーバーへのCookbookのアップロード

 Workstationで作成したCookbookをChefサーバーにアップロードするには、「knife cookbook upload」コマンドを利用する。ここで「-a」オプション付きでこのコマンドを実行すると、設定時に指定したCookbookディレクトリに格納されているCookbookすべてがサーバーにアップロードされる。

$ knife cookbook upload -a
Uploading apt          [2.0.0]
Uploading aws          [0.101.2]
Uploading build-essential [1.4.0]
Uploading database     [1.4.0]
Uploading mysql        [3.0.2]
Uploading openssl      [1.0.2]
Uploading postgresql   [3.0.2]
Uploading xfs          [1.1.0]
Uploaded all cookbooks.

クライアント(ノード)の設定

 最後に、ChefサーバーからCookbookをダウンロードして設定を実行するクライアント(ノード)の設定を行う。ノードで必要となるソフトウェアはスタンドアロン構成の場合と同様、chefパッケージに含まれている。

# yum install ruby ruby-devel rubygems make gcc
# gem install chef

 また、Chefサーバーからscpなどで/etc/chef-server/chef-validator.pemをコピーし、「/etc/chef/validation.pem」として保存しておく。

# mkdir -p /etc/chef
$ scp <Chefサーバーのホスト名>:/etc/chef-server/chef-validator.pem /etc/chef/validation.pem

 次に、設定ファイル「/etc/chef/client.rb」を作成する。内容は以下のようになる。

chef_server_url 'https://<ChefサーバーのFQDN>'
node_name '<クライアントのノード名>'

 また、クライアント側でもサーバーのFQDNの名前解決ができる必要がある。DNSや/etc/hostsファイルなどの設定をしておこう。

 以上の設定が完了したら、chef-clientコマンドでChefサーバー上にあるCookbookが実行できるようになる。たとえば、「mysql::client」というRecipeを実行するには、以下のようにする。

# chef-client -o mysql::client

異なるOSが混在している環境でも効果を発揮

 以上、Chefの概要や基本的な使い方を一通り説明してきたが、ここで紹介した機能はChefの機能のほんの一部である。今回紹介できなかった機能としては、サーバーの設定内容をJSON形式のファイルで管理する「Data Bag」という機能や、Webベースの管理コンソールを使ったGUIでのサーバー管理、サーバー側からのノードの操作などがある。現時点ではChefに関する日本語でのまとまった資料は少ないため、英語リファレンスを読み進めていく必要があるのがややハードルの高いところだろう。

 Chefが便利なのは、Opscodeやサードパーティが公開しているCookbookを流用することで、設定ファイルの記述を少なくできる点だ。公開されているCookbookはOSやLinuxディストリビューションの種別が異なっても同じように利用できることが多いため、管理対象のOSを問わず同じ手順で管理が行える点もメリットだ。いっぽうで公開されているCookbookの中身はそれなりに複雑になっており、またほかのCookbookに依存しているものも多いため、動作内容の把握や問題発生時の解決に手間取ることもある点には注意したい。また、より踏み込んだ作業をしようとすると、ある程度Rubyの知識も必要になる。

 なお、同様の設定管理ツールには前回記事で紹介したPuppetがある。設定ファイルの作成方法などは異なるものの、どちらも基本的な機能などは同じであるので、設定管理ツールを導入する際は両者を比較してどちらを使うかを検討してみると良いだろう。