サーバー設定ツール「Chef」応用編:knife-soloとData Bagを使う

 サーバー管理ツール「Chef(シェフ)」は、ファイルに記述した設定内容に応じて自動的にユーザーの作成やパッケージのインストール、設定ファイルの編集などを行うツールだ。今回はChefの応用編として、Chefサーバーなしに複数台のサーバー管理を行う「knife-solo」というツールと、設定のためのデータなどを一元管理できる「Data Bag」という仕組みを紹介する。

knife-soloを使った複数台サーバー管理

 Chefは「Cookbook(クックブック)」や「Recipe(レシピ)」と呼ばれる設定ファイルに従って、ユーザーの作成やソフトウェアのインストール、ネットワークやファイアウォール、データベースなどの設定など、さまざまな設定作業を自動で実行するツールだ。利用するメリットとしてサーバーの設定を一元的に管理できる、実行する設定内容をチェックしやすくミスを防ぎやすいなどがあり、近年注目を集めている。

 Chefの基本的な使い方については以前の『サーバー設定ツール「Chef」の概要と基礎的な使い方』という記事で紹介しているが、今回はChefの応用編として、小規模な環境でのChefの使い勝手を向上させる「knife-solo」というツールの使い方と、設定データなどを別ファイルやデータベースで管理する「Data Bag」という仕組みについて紹介していこう。

Chefの構成——Chef Serverとchef-solo

 さて、今回紹介するknife-soloというツールは、Chef Serverを使わずに複数台のサーバーをChefで管理するためのツールだ。『サーバー設定ツール「Chef」の概要と基礎的な使い方』記事で解説したとおり、Chefを利用するための構成としてはChef Serverを利用するものと、Chef Serverを使わず、代わりに「chef-solo」というツールを使うものの2通りがある。

 Chef Serverを利用する場合、Cookbookなどの設定ファイルはすべてChef Server上に保存される。設定対象となるマシン側にはあらかじめChefのクライアントをインストールしておき、このクライアントがChef Server上のCookbookなどを参照して各種設定を実行する(図1)。また、Cookbookなどの作成作業は「Workstation」と呼ばれる作業用マシン上で行い、Chefに含まれるknifeコマンドを使ってChef Serverにそれらを登録する、という形になっている(WorkstationとChef Serverは同一のマシンでも構わない)。

図1 Chef Serverを使った構成
図1 Chef Serverを使った構成

 この構成の場合、Cookbookなどの設定ファイルはChef Server上で一元管理されるため、設定対象のマシンの台数が増えても管理の手間は大きくは変わらないというメリットがある。ただ、Chef Serverを用意する必要がある点や、Chef Serverを実行するマシンにはFQDNが与えられている必要があるなど、やや大がかりになってしまうという欠点もある。

 いっぽうchef-soloを使った構成では、設定対象のそれぞれのマシン上にChef ClientやCookbookなどの設定ファイルを配置し、chef-soloコマンドで設定処理を実行する(図2)。この場合Chef Serverは不要だが、設定対象のマシンそれぞれにCookbookを配置する必要がある。

図2 chef-soloを使った構成
図2 chef-soloを使った構成

 この構成では、管理するマシンが少数なら良いが、管理対象が増えると設定ファイルの管理が大変になる。また、設定作業を実行する際は対象のマシンそれぞれにログインしてchef-soloコマンドを実行しなければならない。

knife-soloを使ったChef環境

 chef-soloはChef Serverが不要であるため気軽に利用できるが、設定対象のそれぞれのサーバーにChef ClientやCookbookを配置して管理しなければならない。この作業を自動化するツールが、今回紹介するknife-soloだ。

 knife-soloは、作業用マシン上に用意したCookbookなどの設定ファイルを設定対象のマシンにコピーし、設定対象のマシン上でchef-soloコマンドを実行する、という一連の作業を自動実行するツールだ(図3)。設定ファイルのコピーにはrsyncが、chef-soloコマンドの実行にはsshが利用される。

図3 knife-soloを使った構成
図3 knife-soloを使った構成

 knife-soloを利用することで、作業用マシン上でCookbookなどを一元管理することができ、Cookbookを変更した際も簡単に設定対象のマシンにそれを反映させることが可能になる。

 以下ではこのknife-soloを使ったChef環境の構築方法を説明していくが、これらはすべて作業用マシンでの作業になる。設定対象のマシンではSSHでのリモートログインおよびrsyncが利用できる必要があるが、それ以外の設定は基本的には不要だ。

knife-soloのインストールと初期設定

 kinife-soloは、Rubyのパッケージシステムであるgem経由でインストールが可能だ。chefがインストールされている環境であれば、下記のようにしてインストールできる。

# gem install knife-solo

 また、knife-soloはWindows環境でも利用可能だ。Ruby環境が必要となるが、これはWindows向けの「RubyInstaller」というインストーラを利用すると簡単だ。

 RubyInstallerでRubyをインストールしたら、あとはLinuxの場合と同様、gemコマンドでchefパッケージおよびknife-soloパッケージをインストールできる。なお、記事執筆時点のchefパッケージ(バージョン11.6.2)では、依存するパッケージのうちいくつかで最新ではないものが要求されていたため、次のようにバージョンを指定して個別にインストールしている。

> gem install windows-pr -v 1.2.1
> gem install win32-process -v 0.6.5
> gem install mixlib-shellout -v 1.1.0
> gem install chef
> gem install knife-solo

 knife-soloをインストールしたら、続いて「knife configure」コマンドを実行してknifeの初期設定を実行する。

$ knife configure

 ここでは対話式でいくつかの設定が行えるが、すべてデフォルトのままで問題ない。設定が完了するとユーザーのホームディレクトリに.chefディレクトリが作成され、そこに設定内容が記載されたknife.rbというファイルが生成される。続いてこのファイルをテキストエディタで開き、Cookbookが格納されたディレクトリを指定する設定項目を追加しておく。たとえば、「/home/hylom/chef-repo/cookbooks」というディレクトリにCookbooksを格納する場合、以下のような行を追加すれば良い。

cookbook_path ["/home/hylom/chef-repo/cookbooks"]

 なお、Windows環境の場合はパスの区切り文字にWindows標準の「\」(バックスラッシュもしくは円マーク)ではなく、次のように「/」を使用する。

cookbook_path ["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」がそのインストーラだ。

 このインストーラをダウンロードして実行すると、図4のような画面が表示されるので、ここで「Install」をクリックする、

図4 mingw-getのインストーラ
図4 mingw-getのインストーラ

 インストールが完了すると、MinGW/MSYSで配布されているパッケージのインストールやアンインストールを行える「MinGW Installation Manager」というツールがスタートメニューに追加されるので、これを起動する。MinGW Installation Managerでは左ペインでジャンルを選択すると、右上ペインにパッケージ一覧が表示される。インストールしたいパッケージを右クリックし、「Mark for Installation」を選択するとそのパッケージにチェックが入り、インストールが予約される(図5)。

図5 インストールしたいパッケージを右クリックして「Mark for Installation」を選択する
図5 インストールしたいパッケージを右クリックして「Mark for Installation」を選択する

 今回はOpenSSHおよびrsyncが必要なので、「mysys-openssh」および「mysys-rsync」パッケージをインストールすれば良い。インストールするパッケージを選択したら、「Installation」メニューの「Apply 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ファイルに次のような設定を追記しておく。もしこのファイルがなければ、新規作成して次の内容を記述しておけば良い。

# cygwinを想定しているツール用のHack
#Win32_Path		Mount_Point
c:		/cygdrive/c

 なお、この例ではC:ドライブのみのマッピングを指定しているが、D:ドライブなどほかのドライブもある場合は「d: /cygdrive/d」などのようにそれらのドライブの記述も追加しておこう。

knife-soloを使って設定対象のマシンにChef環境をインストールする

 以上の設定が完了した状態で、設定対象のマシンと設定作業に使用するユーザーを指定して「knife solo prepare」コマンドを実行すると、設定対象のマシンにChefでの環境設定に必要なファイルやツールが自動的にインストールされる。

 たとえば、設定対象のマシンのIPアドレスが「172.17.4.78」で、設定作業に使用するユーザーが「root」の場合、以下のように実行する。

$ knife solo prepare root@172.17.4.78

設定対象のマシンにCookbookを転送して設定作業を実行する

 設定対象のマシンにCookbookを転送して設定作業を実行するには、「knife solo cook」コマンドを使用する。たとえば、Cookbook格納用ディレクトリ内にある「setup-user」というCookbookを「172.17.4.78」というサーバーで実行するには以下のようにする。

$ knife solo cook root@172.17.4.78 -o setup-user

 この場合、その出力は図6のようになる。

図6 「knife solo cook」コマンドでChefによる設定作業を実行した場合の出力
図6 「knife solo cook」コマンドでChefによる設定作業を実行した場合の出力

Data Bagを使う

 ChefのCookbookにはさまざまな情報を記述できるが、その中身は作業内容と設定内容におおまかに分けることができる。たとえば「taroというユーザーを作成し、そのuidは1000」というCookbookであれば、作業内容は「ユーザーを作成する」、設定内容は「taro」や「1000」となる。今まではこれらを1つのRecipe内に記述していたが、この場合、設定内容が変わるとRecipeやCookbookを書き換えなければならなかった。たとえば、「taro」だけでなく「john」というユーザーも作成したいと思った場合、Recipeを書き換えてこのユーザーを作成するための記述を追加しなければならない(図7)。

図7 Cookbook内に作業内容と設定内容を記述した場合
図7 Cookbook内に作業内容と設定内容を記述した場合

 しかし、taroというユーザーを作成する処理も、johnというユーザーを作成する処理もその作業内容自体は同じであるため、似たような記述がRecipe内に並ぶこととなる。このような場合、Chefに用意されている「Data Bag」という仕組みを利用することで、作業内容と設定内容を分離することが可能だ(図8)。

図8 設定内容をData Bagに分離した場合
図8 設定内容をData Bagに分離した場合

 Data Bagは任意のデータを格納できるデータベースのようなもので、Recipeからその内容を参照できる。たとえばユーザーを作成する例の場合、Data Bagに作成するユーザーの情報を格納し、Recipe側ではData Bagからデータを順次読み出してユーザーを作成するという処理を記述すれば良い。

 Data BagはChef Serverを使う構成でも、chef-soloを使う構成でも利用可能だ。Chef Serverを利用する場合、Data Bagに格納したデータはChef Server内に格納され、そのChef Server内に保存されているすべてのCookbookからアクセスできる。データはJSON形式で格納され、RecipeからはRubyのハッシュとしてアクセスできる。

 いっぽう、chef-soloを使う構成では専用のデータベースは使われないが、代わりに指定したディレクトリ以下に格納するデータをJSON形式で記述したファイルを配置するという形でData Bagを利用できる。

 以下では、Chef Serverを使う構成と、chef-solo/Knife Soloを使う場合で、以下のような、「taro」というグループおよびユーザーを作成するというCookbookを、Data Bagを使って作成し使用する流れを紹介する。

group "taro" do
  gid 1000
  action :create
end

user "taro" do
  home "/home/taro"
  password '$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0'
  shell "/bin/bash"
  uid 1000
  gid "taro"
  supports :manage_home => true
  action :create
end

 このCookbookの内容については以前の記事で紹介しているので、詳しくはそちらを参照してほしい。

Chef Server構成でData Bagを使う

 それでは、まずChef Serverを使う構成でData Bagにデータを格納する方法を説明しよう。Data Bagは「knife data bag create」コマンドで作成できる。たとえば、「initial_accounts」という名前のData Bagを作成するには以下のようにする。

$ knife data bag create initial_accounts

 続いて、data bagに格納するデータを用意する。今回は作成するユーザー名やグループ名、関連プロパティなどを記述した「default.json」というJSONファイルを用意した。

{
  "id": "default",
  "groups": [
    {
      "name": "taro",
      "gid": 1000
    }
  ],
  "users": [
    {
      "name": "taro",
      "home": "/home/taro",
      "password": "$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0",
      "shell": "/bin/bash",
      "uid": 1000,
      "gid": "taro"
    }
  ]
}

 ここで、注目したいのが「"id": "default"」という項目だ。この「id」はData Bagに格納するデータに必須の項目で、Data Bagに格納するデータ(ハッシュ)は、この項目で指定した名前で管理される。たとえばこのデータは、Recipe側からは「default」という名前でアクセスできる。

 JSONファイルをData Bagに格納するには、「knife data bag from file」コマンドを利用する。たとえば、先に作成した「initial_accounts」というData Bagに「defaoult.json」ファイルに記述されたデータを格納するには、以下のようにする。

$ knife data bag from file initial_accounts default.json

 格納したデータは、「knife data bag show」コマンドで確認できる。

$ knife data bag show initial_accounts default
groups:
  gid:  1000
  name: taro
id:     default
users:
  gid:      taro
  home:     /home/taro
  name:     taro
  password: $6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0
  shell:    /bin/bash
  uid:      1000

 なお、Data Bagに格納したデータは、実際にはChef Serverに含まれるPostgreSQLデータベース内に格納されている。このデータは、Chef Serverを稼動させているマシン上で「opscode-pgsql」ユーザーを使ってPostgreSQLデータベースにアクセスすることで確認可能だ。

Data Bagを使ったRecipeを作成する

 続いて、RecipeからData Bagに格納したデータにアクセスする方法を説明しよう。今回は「setup-user」というCookbookを作成し、そこから先ほどのData Bagにアクセスしてユーザーやグループを作成することにする。

$ cd chef-repo/cookbooks/
$ knife cookbook create setup-user -o .
** Creating cookbook setup-user
** Creating README for cookbook: setup-user
** Creating CHANGELOG for cookbook: setup-user
** Creating metadata for cookbook: setup-user
$ vi setup-user/recipes/default.rb

Recipe(default.rb)の内容は、以下のようになる。

accounts = data_bag('initial_accounts')
accounts.each do |id|
  item = data_bag_item('initial_accounts', id)

  item['groups'].each do |g|
    group g['name'] do
      gid g['gid']
      action :create
    end
  end

  item['users'].each do |u|
    user u['name'] do
      home u['home']
      password u['password']
      shell u['shell']
      uid u['uid']
      gid u['gid']
      supports :manage_home => true
      action :create
    end
  end
end

 Recipe内からData Bagのデータを取得するには、data_bag関数を使用する。引数には対象のData Bag名を文字列で指定する。たとえば「initial_accounts」というData Bagを取得するには、以下のようになる。

accounts = data_bag('initial_accounts')

 data_bag関数の戻り値は、data_bagに含まれるデータの「id」を格納した配列となる。続いて、Data Bag名とidを引数に与えてdata_bag_item関数を実行することで、データをハッシュとして取得できる。今回の例では、以下のように配列のeachメソッドを使ってidを順番に取り出し、それを引数としてdata_bag_item関数を呼び出すことでデータを取り出している。

accounts.each do |id|
  item = data_bag_item('initial_accounts', id)

 data_bag_item関数の戻り値は、JSONで指定したものと同じデータ構造を持つハッシュとなっており、以下のように['キー名']という書式で各項目を取得可能だ。

  item['groups'].each do |g|
    group g['name'] do
      gid g['gid']
      action :create
    end
  end

 作成したCookbookは前回解説したとおり「knife cookbook upload」コマンドでアップロードできる。

$ knife cookbook upload setup-user

 このCookbookをクライアント側で実行すると、以下のようにユーザーおよびグループが作成される。

# chef-client -o setup-user
Starting Chef Client, version 11.6.2
[2013-10-24T19:58:40+09:00] WARN: Run List override has been provided.
[2013-10-24T19:58:40+09:00] WARN: Original Run List: []
[2013-10-24T19:58:40+09:00] WARN: Overridden Run List: [recipe[setup-user]]
resolving cookbooks for run list: ["setup-user"]
Synchronizing Cookbooks:
  - setup-user
Compiling Cookbooks...
Converging 2 resources
Recipe: setup-user::default
  * group[taro] action create (up to date)
  * user[taro] action create
    - alter user user[taro]

Chef Client finished, 1 resources updated

 このように作成されたCookbookでは、Cookbook側を変更することなく、Data Bagのみを変更することで作成するユーザーを追加したり、その情報を変更することが可能だ。たとえば、新たに「jiro」というユーザーを追加したい場合、JSONファイルを以下のように修正すれば良い。

{
  "id": "default",
  "groups": [
    {
      "name": "hylom",
      "gid": 1000
    },
    {
      "name": "jiro",
      "gid": 1001
    }
  ],
  "users": [
    {
      "name": "hylom",
      "home": "/home/hylom",
      "password": "$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0",
      "shell": "/bin/bash",
      "uid": 1000,
      "gid": "hylom"
    },
    {
      "name": "jiro",
      "home": "/home/jiro",
      "password": "$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0",
      "shell": "/bin/bash",
      "uid": 1001,
      "gid": "jiro"
    }
  ]
}

 このJSONデータをData Bagに格納し、再度Cookbookを実行すると新たにユーザー「jiro」が作成される。

$ knife data bag from_file initial_accounts default.json
# chef-client -o setup-user
Starting Chef Client, version 11.6.2
[2013-10-24T20:08:31+09:00] WARN: Run List override has been provided.
[2013-10-24T20:08:31+09:00] WARN: Original Run List: [recipe[setup-user]]
[2013-10-24T20:08:31+09:00] WARN: Overridden Run List: [recipe[setup-user]]
resolving cookbooks for run list: ["setup-user"]
Synchronizing Cookbooks:
  - setup-user
Compiling Cookbooks...
Converging 4 resources
Recipe: setup-user::default
  * group[taro] action create (up to date)
  * group[jiro] action create
    - create group[jiro]

  * user[taro] action create (up to date)
  * user[jiro] action create
    - create user user[jiro]

Chef Client finished, 2 resources updated

データを暗号化する

 Data Bagではデータを暗号化した上で格納することも可能だ。パスワードやそのハッシュなど、閲覧されると問題が発生する可能性のあるデータを格納する場合などに利用できる。なお、暗号化にはopensslコマンドで作成した鍵ファイルを使用し、この鍵ファイルは設定対象のマシンそれぞれに格納しておく必要がある。公開鍵方式ではなく、1つの鍵ファイルで暗号化も復号もできるため、この鍵ファイルの管理には注意してほしい。

 暗号化に使用する鍵ファイルは、以下のようにして作成できる。

$ openssl rand -base64 512 > secret_key

 これで、secret_keyというファイルに鍵情報が格納される。

 データを暗号化してData Bagに格納するには、「knife data bag from file」コマンドを「--secret-file <鍵ファイル>」オプション付きで実行する。

$ knife data bag create initial_accounts_secret
Created data_bag[initial_accounts_secret]
$ knife data bag from file initial_accounts_secret default.json --secret-file secret_key
Updated data_bag_item[initial_accounts_secret::default]

 このように鍵ファイルを指定して格納したデータは、showコマンドで表示させてもその中身は分からない。

$ knife data bag show initial_accounts_secret default
groups:
  cipher:         aes-256-cbc
  encrypted_data: TLa/BNAc26FSpOABekf7ALvd3KhQ/iXZzggP/hSAiqBn3WYk63h7hX+Aguta
  0zMW

  iv:             v6fzk6WYzYayr6IGj7j38A==

  version:        1
id:     default
users:
  cipher:         aes-256-cbc
  encrypted_data: x98kLVBQr0k3YoDmOtyRWtbgpOMAEeZFGJJ2kAGeEz1JHc92a3fb/O+Ky/j1
  9kJRbgFDkrXBkN7UDLpXbAAx0YPbOhhXQdOs/kDXOyVsjztBRgzdJB/I/6ZO
  +LytQpz7px6M8Jk8sd2V1lGYgUFm7Fq+DQjXlo3SLKMPqGVLxjJjanHLtm2f
  zZa/op2kAFWlGDamhBoWwrXbPGNcWiBeArRPvMzJe4BT52/czse36WU5OyGz
  TcOKpWVhl03lnh5vZ/v+cthDLl+hxsWGuPUvGY3suIrxd2SKHDGKl+X+HWc=

  iv:             aYvs9pPh5wRPAoBGu+DDSQ==

  version:        1

 もし暗号化されたデータの内容を確認したい場合は、「--secret-file <鍵ファイル>で暗号化に使用した鍵ファイルを指定すれば良い。

$ knife data bag show --secret-file secret_key initial_accounts_secret default
groups:
  gid:  1000
  name: taro
id:     default
users:
  gid:      taro
  home:     /home/taro
  name:     taro
  password: $6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0
  shell:    /bin/bash
  uid:      1000

 いっぽう、暗号化されたData Bag項目にアクセスしたい設定対象サーバーには、あらかじめ鍵ファイルを配置しておく必要がある。鍵ファイルのデフォルトの保存先は、/etc/chef/encrypted_data_bag_secretだ。scpコマンドなどを利用してサーバーにコピーし、配置しておこう。

# cp secret_key /etc/chef/encrypted_data_bag_secret

 Recipeから暗号化されたData Bag項目にアクセスするには、data_bag_item関数の代わりにChef::EncryptedDataBagItem.load関数を使用する。以下の例は、先に紹介したRecipeを、暗号化されたData Bag項目を使用するよう書き換えたものだ。

accounts = data_bag('initial_accounts_secret')
accounts.each do |id|
  # item = data_bag_item('initial_accounts_secret', id)
  item = Chef::EncryptedDataBagItem.load('initial_accounts_secret', id)

  item['groups'].each do |g|
    group g['name'] do
      gid g['gid']
      action :create
    end
  end

  item['users'].each do |u|
    user u['name'] do
      home u['home']
      password u['password']
      shell u['shell']
      uid u['uid']
      gid u['gid']
      supports :manage_home => true
      action :create
    end
  end
end

chef-solo環境でData Bagを使う

 Chef Serverを使用しないchef-solo環境ではデータを一元管理するデータベースがあるわけではなく、knifeコマンドも利用できない。その代わりとして、任意のディレクトリにJSONファイルを配置することでData Bagとして利用できるようになっている。

 Data Bagとして利用するディレクトリは、chef-soloの設定ファイルである/etc/chef/solo.rb内で指定できる。たとえば「/root/chef-repo/data_bags」ディレクトリをData Bagの格納先として利用する場合、以下の行をsolo.rbファイルに追加しておけば良い。

data_bag_path "/root/chef-repo/data_bags"

 chef-solo環境では、ここで指定したディレクトリ内にサブディレクトリを作成し、そこにJSONファイルを配置する。作成したサブディレクトリData Bag名として認識される。

 たとえば、/root/chef-repoというディレクトリをChefリポジトリとして使っている場合、「initial_accounts」というData Bagを作成するには以下のようにする。

# mkdir -p /root/chef-repo/data_bags/initial_accounts

 このディレクトリにJSONファイルを配置することで、Data Bag項目としてそこに記述されたデータにアクセスできる。

$ cp default.json /root/chef-repo/data_bags/initial_accounts/

 CookbooksやRecipe側の記述内容についてはChef-Solo環境でもChef Server環境の場合と同じだ。

knife-solo環境でData Bagを使う

 knife-soloでは、内部的にはchef-soloが使われているため、基本的にはchef-soloの場合と同様にJSONファイルでData Bagが管理される。作業用マシン側のknife.rbファイルに作業用マシン上でData Bagが格納されているディレクトリを指定しておけば、「knife solo cook」コマンドの実行時にそのディレクトリも設定対象のマシンに転送される。

Chef Server構築の手間なしに利用できるknife-soloは有力な選択肢に

 今回解説したknife-soloは、Chef Serverを構築することなしに、複数台サーバーの設定を容易に行えるツールだ。これを利用することで複数台サーバーの設定管理を一元管理できるようになるので、Chefを導入するハードルを大幅に下げることができる。とはいえ、knife-soloではサーバーの管理者が複数いる場合、作業用マシン上のCookbookなどの同期が必要となる。そのため、そういった環境ではChef Serverを利用したほうが良い場合もある。環境に応じて、最適な構成を検討するべきだろう。

 また、Data Bagは作業内容と設定内容を分離するためのツールだ。これは、一般的なプログラミングにおけるプログラムとデータの分離に相当すると考えれば分かりやすいだろう。プログラムとデータを分離することで保守性能や再利用性が向上するが、これをサーバーの環境設定においても導入したのがData Bagとなる。やや導入は面倒であるが、Data Bagを使うことで保守性の高いCookbookを作成できるので、うまく活用すると良いだろう。

【関連記事】
>>サーバー設定ツール「Chef」の概要と基礎的な使い方

おしらせ

banner_vps