松島浩道サーバー管理ツール「Chef(シェフ)」は、ファイルに記述した設定内容に応じて自動的にユーザーの作成やパッケージのインストール、設定ファイルの編集などを行うツールだ。Bag」という仕組みを紹介する。knife-soloを使った複数台サーバー管理Chefは「Cookbook(クックブック)」や「Recipe(レシピ)」と呼ばれる設定ファイルに従って、ユーザーの作成やソフトウェアのインストール、ネットワークやファイアウォール、データベースなどの設定など、さまざまな設定作業を自動で実行するツールだ。利用するメリットとしてサーバーの設定を一元的に管理できる、実行する設定内容をチェックしやすくミスを防ぎやすいなどがあり、近年注目を集めている。Bag」という仕組みについて紹介していこう。Serverを使わずに複数台のサーバーをChefで管理するためのツールだ。Serverを使わず、代わりに「chef-solo」というツールを使うものの2通りがある。Server上に保存される。Server上のCookbookなどを参照して各種設定を実行する(図1)。Serverは同一のマシンでも構わない)。Server上で一元管理されるため、設定対象のマシンの台数が増えても管理の手間は大きくは変わらないというメリットがある。Serverを実行するマシンにはFQDNが与えられている必要があるなど、やや大がかりになってしまうという欠点もある。ClientやCookbookなどの設定ファイルを配置し、chef-soloコマンドで設定処理を実行する(図2)。Serverは不要だが、設定対象のマシンそれぞれにCookbookを配置する必要がある。chef-soloを使った構成この構成では、管理するマシンが少数なら良いが、管理対象が増えると設定ファイルの管理が大変になる。設定作業を実行する際は対象のマシンそれぞれにログインしてchef-soloコマンドを実行しなければならない。ClientやCookbookを配置して管理しなければならない。この作業を自動化するツールが、今回紹介するknife-soloだ。knife-soloは、作業用マシン上に用意したCookbookなどの設定ファイルを設定対象のマシンにコピーし、設定対象のマシン上でchef-soloコマンドを実行する、という一連の作業を自動実行するツールだ(図3)。設定ファイルのコピーにはrsyncが、chef-soloコマンドの実行にはsshが利用される。knife-soloを使った構成knife-soloを利用することで、作業用マシン上でCookbookなどを一元管理することができ、Cookbookを変更した際も簡単に設定対象のマシンにそれを反映させることが可能になる。以下ではこのknife-soloを使ったChef環境の構築方法を説明していくが、これらはすべて作業用マシンでの作業になる。設定対象のマシンではSSHでのリモートログインおよびrsyncが利用できる必要があるが、それ以外の設定は基本的には不要だ。knife-soloのインストールと初期設定kinife-soloは、Rubyのパッケージシステムであるgem経由でインストールが可能だ。chefがインストールされている環境であれば、下記のようにしてインストールできる。knife-soloまた、knife-soloはWindows環境でも利用可能だ。Ruby環境が必要となるが、これはWindows向けの「RubyInstaller」というインストーラを利用すると簡単だ。RubyInstallerでRubyをインストールしたら、あとはLinuxの場合と同様、gemコマンドでchefパッケージおよびknife-soloパッケージをインストールできる。記事執筆時点のchefパッケージ(バージョン11.6.2)では、依存するパッケージのうちいくつかで最新ではないものが要求されていたため、次のようにバージョンを指定して個別にインストールしている。configure」コマンドを実行してknifeの初期設定を実行する。configureここでは対話式でいくつかの設定が行えるが、すべてデフォルトのままで問題ない。設定が完了するとユーザーのホームディレクトリに.chefディレクトリが作成され、そこに設定内容が記載されたknife.rbというファイルが生成される。続いてこのファイルをテキストエディタで開き、Cookbookが格納されたディレクトリを指定する設定項目を追加しておく。「/home/hylom/chef-repo/cookbooks」というディレクトリにCookbooksを格納する場合、以下のような行を追加すれば良い。["/home/hylom/chef-repo/cookbooks"]なお、Windows環境の場合はパスの区切り文字にWindows標準の「\」(バックスラッシュもしくは円マーク)ではなく、次のように「/」を使用する。["C:/Users/hylom/chef-repo/cookbooks"]また、knife-soloではSSHおよびrsyncを利用してCookbookなどのコピーを行うので、作業用マシンから設定対象のマシンにSSHでログインできるように設定しておく。このとき、SSHでログインしたユーザーの権限でchef-soloコマンドが実行できる必要がある。今回はrootユーザーでログインしてchef-soloコマンドを実行するようにしているが、rootユーザーでのリモートログインはセキュリティを低下される可能性があるので注意してほしい。Windows環境にopensshとrsyncをインストールするknife-soloは前述の通り、sshやrsyncといったコマンドを利用してCookbookの転送やコマンドの実行を行う。Linux環境ではこれらのツールはデフォルトでインストールされていることが多いが、Windows環境ではChefとは別に用意する必要がある。今回は、Windows向けにUNIX向けツールを提供するMinGW/MSYSというプロジェクトが提供しているsshやrsyncをインストールする方法を紹介しておこう。MinGW/MSYSが配布しているツールは、mingw-getというツールでインストールできる。mingw-getのインストーラはSourceForge.JPのダウンロードページからダウンロードできる。ダウンロードページの「リリースファイル一覧」内の「Installer」下にある「mingw-get-setup.exe」がそのインストーラだ。Manager」というツールがスタートメニューに追加されるので、これを起動する。Managerでは左ペインでジャンルを選択すると、右上ペインにパッケージ一覧が表示される。Installation」を選択するとそのパッケージにチェックが入り、インストールが予約される(図5)。Installation」を選択する今回はOpenSSHおよびrsyncが必要なので、「mysys-openssh」および「mysys-rsync」パッケージをインストールすれば良い。Changes」を選択するとインストール作業を実行できる。knife-soloではCygwinというプロジェクトが配布しているrsyncやsshの利用を想定しているため、そのままではパス指定でのエラーが発生する。CygwinとMinGW/MSYSでは、パスの指定方法が若干異なるからだ(CygwinではC:ドライブ以下を参照するのに「/cygdrive/c/」というパスを使うが、MinGW/MSYSでは「/c/」というパスを使う)。この問題を回避するため、MinGW/MSYSのインストール先(デフォルトではC:\MinGW\msys\1.0)以下の/etc/fstabファイルに次のような設定を追記しておく。このファイルがなければ、新規作成して次の内容を記述しておけば良い。/cygdrive/d」などのようにそれらのドライブの記述も追加しておこう。prepare」コマンドを実行すると、設定対象のマシンにChefでの環境設定に必要なファイルやツールが自動的にインストールされる。設定対象のマシンのIPアドレスが「172.17.4.78」で、設定作業に使用するユーザーが「root」の場合、以下のように実行する。cook」コマンドを使用する。Cookbook格納用ディレクトリ内にある「setup-user」というCookbookを「172.17.4.78」というサーバーで実行するには以下のようにする。setup-userこの場合、その出力は図6のようになる。Bagを使うChefのCookbookにはさまざまな情報を記述できるが、その中身は作業内容と設定内容におおまかに分けることができる。「taroというユーザーを作成し、そのuidは1000」というCookbookであれば、作業内容は「ユーザーを作成する」、設定内容は「taro」や「1000」となる。今まではこれらを1つのRecipe内に記述していたが、この場合、設定内容が変わるとRecipeやCookbookを書き換えなければならなかった。「taro」だけでなく「john」というユーザーも作成したいと思った場合、Recipeを書き換えてこのユーザーを作成するための記述を追加しなければならない(図7)。Cookbook内に作業内容と設定内容を記述した場合しかし、taroというユーザーを作成する処理も、johnというユーザーを作成する処理もその作業内容自体は同じであるため、似たような記述がRecipe内に並ぶこととなる。Bag」という仕組みを利用することで、作業内容と設定内容を分離することが可能だ(図8)。Bagは任意のデータを格納できるデータベースのようなもので、Recipeからその内容を参照できる。Bagからデータを順次読み出してユーザーを作成するという処理を記述すれば良い。Serverを使う構成でも、chef-soloを使う構成でも利用可能だ。Server内に保存されているすべてのCookbookからアクセスできる。データはJSON形式で格納され、RecipeからはRubyのハッシュとしてアクセスできる。Bagを使って作成し使用する流れを紹介する。:createendこのCookbookの内容については以前の記事で紹介しているので、詳しくはそちらを参照してほしい。Bagにデータを格納する方法を説明しよう。create」コマンドで作成できる。Bagを作成するには以下のようにする。bagに格納するデータを用意する。今回は作成するユーザー名やグループ名、関連プロパティなどを記述した「default.json」というJSONファイルを用意した。“default”」という項目だ。Bagに格納するデータ(ハッシュ)は、この項目で指定した名前で管理される。このデータは、Recipe側からは「default」という名前でアクセスできる。file」コマンドを利用する。Bagに「defaoult.json」ファイルに記述されたデータを格納するには、以下のようにする。show」コマンドで確認できる。Serverに含まれるPostgreSQLデータベース内に格納されている。Serverを稼動させているマシン上で「opscode-pgsql」ユーザーを使ってPostgreSQLデータベースにアクセスすることで確認可能だ。Bagに格納したデータにアクセスする方法を説明しよう。Bagにアクセスしてユーザーやグループを作成することにする。setup-user/recipes/default.rbRecipe(default.rb)の内容は、以下のようになる。Bagのデータを取得するには、data_bag関数を使用する。Bag名を文字列で指定する。Bagを取得するには、以下のようになる。data_bag('initial_accounts')data_bag関数の戻り値は、data_bagに含まれるデータの「id」を格納した配列となる。Bag名とidを引数に与えてdata_bag_item関数を実行することで、データをハッシュとして取得できる。今回の例では、以下のように配列のeachメソッドを使ってidを順番に取り出し、それを引数としてdata_bag_item関数を呼び出すことでデータを取り出している。id)data_bag_item関数の戻り値は、JSONで指定したものと同じデータ構造を持つハッシュとなっており、以下のように[‘キー名’]という書式で各項目を取得可能だ。upload」コマンドでアップロードできる。setup-userこのCookbookをクライアント側で実行すると、以下のようにユーザーおよびグループが作成される。Bagのみを変更することで作成するユーザーを追加したり、その情報を変更することが可能だ。新たに「jiro」というユーザーを追加したい場合、JSONファイルを以下のように修正すれば良い。Bagに格納し、再度Cookbookを実行すると新たにユーザー「jiro」が作成される。Bagではデータを暗号化した上で格納することも可能だ。パスワードやそのハッシュなど、閲覧されると問題が発生する可能性のあるデータを格納する場合などに利用できる。暗号化にはopensslコマンドで作成した鍵ファイルを使用し、この鍵ファイルは設定対象のマシンそれぞれに格納しておく必要がある。公開鍵方式ではなく、1つの鍵ファイルで暗号化も復号もできるため、この鍵ファイルの管理には注意してほしい。暗号化に使用する鍵ファイルは、以下のようにして作成できる。secret_keyこれで、secret_keyというファイルに鍵情報が格納される。<鍵ファイル>」オプション付きで実行する。data_bag_item[initial_accounts_secret::default]このように鍵ファイルを指定して格納したデータは、showコマンドで表示させてもその中身は分からない。<鍵ファイル>で暗号化に使用した鍵ファイルを指定すれば良い。Bag項目にアクセスしたい設定対象サーバーには、あらかじめ鍵ファイルを配置しておく必要がある。鍵ファイルのデフォルトの保存先は、/etc/chef/encrypted_data_bag_secretだ。scpコマンドなどを利用してサーバーにコピーし、配置しておこう。Bag項目にアクセスするには、data_bag_item関数の代わりにChef::EncryptedDataBagItem.load関数を使用する。Bag項目を使用するよう書き換えたものだ。Serverを使用しないchef-solo環境ではデータを一元管理するデータベースがあるわけではなく、knifeコマンドも利用できない。Bagとして利用できるようになっている。Bagとして利用するディレクトリは、chef-soloの設定ファイルである/etc/chef/solo.rb内で指定できる。Bagの格納先として利用する場合、以下の行をsolo.rbファイルに追加しておけば良い。"/root/chef-repo/data_bags"chef-solo環境では、ここで指定したディレクトリ内にサブディレクトリを作成し、そこにJSONファイルを配置する。Bag名として認識される。Bagを作成するには以下のようにする。Bag項目としてそこに記述されたデータにアクセスできる。Server環境の場合と同じだ。cook」コマンドの実行時にそのディレクトリも設定対象のマシンに転送される。Serverを構築することなしに、複数台サーバーの設定を容易に行えるツールだ。これを利用することで複数台サーバーの設定管理を一元管理できるようになるので、Chefを導入するハードルを大幅に下げることができる。いえ、knife-soloではサーバーの管理者が複数いる場合、作業用マシン上のCookbookなどの同期が必要となる。Serverを利用したほうが良い場合もある。環境に応じて、最適な構成を検討するべきだろう。Bagは作業内容と設定内容を分離するためのツールだ。これは、一般的なプログラミングにおけるプログラムとデータの分離に相当すると考えれば分かりやすいだろう。Bagを使うことで保守性の高いCookbookを作成できるので、うまく活用すると良いだろう。