Vagrant+Chefでdata_bagsを使ってユーザーを作成してみる

ChefのRecipe(レシピ)にuserリソースを使って記述していくのもいいですがスマートに書けないかと思いdata_bagsを使ってみました。

環境

$vagrant -v
Vagrant 1.6.1
vagrant root
.vagrant
cookbooks
user_book
files
recipes
└data_bags
user.json

こんな感じでdata_bagsフォルダを作ってユーザー作成用のjsonデータを作った

{
  "id" : "username",
  "username" : "username",
  "home" : "/home/username",
  "shell" : "/bin/bash"
}

vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "boxname"
  config.vm.box_url = "http://xxxxx/xxx.box"
  config.omnibus.chef_version = :latest
  config.vm.provision "chef_solo", run_list: ["user_book"]
end

ここには勘違いがありました。

実行してみると・・・

$vagrant provision
〜省略〜
==> default: [2014-06-03T07:03:12+00:00] INFO: *** Chef 11.12.4 ***
==> default: [2014-06-03T07:03:12+00:00] INFO: Chef-client pid: 2397
==> default: [2014-06-03T07:03:14+00:00] INFO: Setting the run_list to ["user_book"] from CLI options
==> default: [2014-06-03T07:03:14+00:00] INFO: Run List is [recipe[user_book]]
==> default: [2014-06-03T07:03:14+00:00] INFO: Run List expands to [user_book]
==> default: [2014-06-03T07:03:14+00:00] INFO: Starting Chef Run for localhost
==> default: [2014-06-03T07:03:14+00:00] INFO: Running start handlers
==> default: [2014-06-03T07:03:14+00:00] INFO: Start handlers complete.
==> default: [2014-06-03T07:03:14+00:00] ERROR: Failed to list data bag items in data bag: "users"
==> default: ================================================================================
==> default: Recipe Compile Error in /tmp/vagrant-chef-3/chef-solo-1/cookbooks/user_book/recipes/default.rb
==> default: ================================================================================
==> default: TypeError
==> default: ---------
==> default: can't convert Array into String
==> default: Cookbook Trace:
==> default: ---------------
==> default:   /tmp/vagrant-chef-3/chef-solo-1/cookbooks/user_book/recipes/default.rb:2:in `from_file'
==> default:
==> default: Relevant File Content:
==> default: ----------------------
==> default: /tmp/vagrant-chef-3/chef-solo-1/cookbooks/user_book/recipes/default.rb:
==> default:
==> default:   1:
==> default:   2>> data_ids = data_bag('users')
==> default:   3:
==> default:   4:  data_ids.each do |id|
==> default:   5:    u = data_bag_item('users', id)
==> default:   6:    user u['username'] do
==> default:   7:      home u['home']
==> default:   8:      shell u['shell']
==> default:   9:    end
==> default:  10:  end
==> default:  11:
==> default:
==> default: [2014-06-03T07:03:14+00:00] ERROR: Running exception handlers
==> default: [2014-06-03T07:03:14+00:00] ERROR: Exception handlers complete
==> default: [2014-06-03T07:03:14+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> default: [2014-06-03T07:03:14+00:00] ERROR: can't convert Array into String
==> default: [2014-06-03T07:03:14+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Chef never successfully completed! Any errors should be visible in the

エラーが発生しました。

始めは「can’t convert Array into String」というエラーをみて型変換のエラー??

なんて思っていましたが調べてもそんな情報ありませんでした。

どちらかというと「ERROR: Failed to list data bag items in data bag: “users”」こちらのエラーが原因でした。

https://tickets.opscode.com/browse/CHEF-4753

どうやらパスがおかしいらしい。

Chefでユーザーを作成していたのでてっきりcookbooksの中にdata_bagsフォルダを作ると思って何も考えずに作ってしまったのですが、どうやらvagrantのトップフォルダの下に作るみたいです。

こちらを読んで試していたのですがどうやら読み飛ばしていたようです^^;
Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Data Bagはcookbook単位ではなくリポジトリ全体にグローバルなスコープのデータ
データは<リポジトリ>/data_bags/xxxに置く

と書いてありました。

ということで作り直してみました。

vagrant root
.vagrant
├data_bags
cookbooks
user_book
files
recipes
user.json

「data_bags」のディレクトリを移動して再度vagrant provisionをしました。

が、またしても同じエラーが・・・。

あれれ・・・

いろいろ調べてみるとどうやらパスも指定してあげる必要がありそう。

vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "boxname"
  config.vm.box_url = "http://xxxxx/xxx.box"
  config.omnibus.chef_version = :latest
  #config.vm.provision "chef_solo", run_list: ["user_book"]
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks"
    chef.data_bags_path = "data_bags"
    chef.run_list = "recipe[user_book]"
  end
end
$vagrant provision
〜省略〜
==> default: [2014-06-03T07:13:42+00:00] INFO: *** Chef 11.12.4 ***
==> default: [2014-06-03T07:13:42+00:00] INFO: Chef-client pid: 3875
==> default: [2014-06-03T07:13:44+00:00] INFO: Setting the run_list to "recipe[user_book]" from CLI options
==> default: [2014-06-03T07:13:44+00:00] INFO: Run List is [recipe[user_book]]
==> default: [2014-06-03T07:13:44+00:00] INFO: Run List expands to [user_book]
==> default: [2014-06-03T07:13:44+00:00] INFO: Starting Chef Run for localhost
==> default: [2014-06-03T07:13:44+00:00] INFO: Running start handlers
==> default: [2014-06-03T07:13:44+00:00] INFO: Start handlers complete.
==> default: [2014-06-03T07:13:44+00:00] INFO: Chef Run complete in 0.021857101 seconds
==> default: [2014-06-03T07:13:44+00:00] INFO: Running report handlers
==> default: [2014-06-03T07:13:44+00:00] INFO: Report handlers complete

成功しました!!

カテゴリー: IT   タグ: ,   この投稿のパーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>