サーバー設定ツール「Chef」をより便利に使うためのテクニック 3ページ

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データベースにアクセスすることで確認可能だ。