Chefを使ってCouchBaseをインストールしてみる

今夜はEngine Yardさんで行われるChefの勉強会に参加するものの、
実は一度もChef触った事ないので、それもどうかと思いますよね、と。
ついでに、先ほど基調講演だけ聴きにいった #CouchConf のCouchBase2.0の話がナイスな
感じだったので試してみたいな、と。

 
■ gemでChefのインストール
 
結構ガッツリいろいろ入りますね。

# gem install chef
~略~
Successfully installed mixlib-config-1.1.2
Successfully installed mixlib-cli-1.3.0
Successfully installed mixlib-log-1.4.1
Successfully installed mixlib-authentication-1.3.0
Successfully installed mixlib-shellout-1.1.0
Successfully installed systemu-2.5.2
Successfully installed ipaddress-0.8.0
Successfully installed ohai-6.16.0
Successfully installed rest-client-1.6.7
Successfully installed net-ssh-2.6.5
Successfully installed net-ssh-gateway-1.2.0
Successfully installed net-ssh-multi-1.1
Successfully installed highline-1.6.15
Successfully installed chef-11.4.0
14 gems installed
~略~

 
続いてchefのコマンドツールであるknifeを入れます。

# gem install knife-solo
Fetching: archive-tar-minitar-0.5.2.gem (100%)
Fetching: librarian-0.0.26.gem (100%)
Fetching: knife-solo-0.2.0.gem (100%)
Thanks for installing knife-solo!
~略~
Successfully installed archive-tar-minitar-0.5.2
Successfully installed librarian-0.0.26
Successfully installed knife-solo-0.2.0
3 gems installed

 
 
■ Chefの設定
 
Chefのクックブック用のディレクトリを作ります。

# mkdir -p /var/chef-solo/cookbooks

上記のディレクトリをsolo.rbにこんな感じで指定↓

# cat solo.rb
file_cache_path "/var/chef-solo"
cookbook_path "/var/chef-solo/cookbooks"

でもってレシピ指定。いつも通りのhogeな感じで。

# cat .chef/chef.json
{
  "run_list": [ "recipe[hoge]" ]
}

 
参考にさせていただいたブログにとりあえず一発叩いてみる的な記述があり、
こういうアプローチ好きなので、自分もとりあえず叩いてみます。
hogeっていうクックブックが無いよん的なログが出てますね。

# chef-solo -c /root/solo.rb -j /root/.chef/chef.json
Starting Chef Client, version 11.4.0
Compiling Cookbooks...
[2013-02-22T13:10:33+09:00] ERROR: Running exception handlers
[2013-02-22T13:10:33+09:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated
[2013-02-22T13:10:33+09:00] FATAL: Stacktrace dumped to /var/chef-solo/chef-stacktrace.out
[2013-02-22T13:10:33+09:00] FATAL: Chef::Exceptions::CookbookNotFound: Cookbook hoge not found. If you're loading hoge from another cookbook, make sure you configure the dependency in your metadata

knife -hしてみたら↓こんなん出てきたので、

** SOLO COMMANDS **
knife solo cook [USER@]HOSTNAME [JSON] (options)
knife solo prepare [USER@]HOSTNAME [JSON] (options)
knife solo clean [USER@]HOSTNAME
knife solo init DIRECTORY
knife solo bootstrap [USER@]HOSTNAME [JSON] (options)

さっそくinitしてみます。

# knife solo init /var/chef-solo/
WARNING: No knife configuration file found
ERROR: Errno::EEXIST: File exists - /var/chef-solo

なんか怒られました…。よく分からないけど # rm -r /var/chef-solo/ して
もっかいトライしてみます。

# knife solo init /var/chef-solo/
WARNING: No knife configuration file found

んで、出来たディレクトリをみてみると、、、

# ls -l /var/chef-solo/
total 24
drwxr-xr-x 2 root root 4096 Feb 22 13:20 cookbooks
drwxr-xr-x 2 root root 4096 Feb 22 13:20 data_bags
drwxr-xr-x 2 root root 4096 Feb 22 13:20 nodes
drwxr-xr-x 2 root root 4096 Feb 22 13:20 roles
drwxr-xr-x 2 root root 4096 Feb 22 13:20 site-cookbooks
-rw-r--r-- 1 root root  319 Feb 22 13:20 solo.rb

アレ、ココにsolo.rb出来てんじゃん、、と。
#上記でディレクトリ作ったり、solo.rb書いたりしたのは不要だったということですね。。

# cat /var/chef-solo/solo.rb
file_cache_path           "/tmp/chef-solo"
data_bag_path             "/tmp/chef-solo/data_bags"
encrypted_data_bag_secret "/tmp/chef-solo/data_bag_key"
cookbook_path             [ "/tmp/chef-solo/site-cookbooks",
                            "/tmp/chef-solo/cookbooks" ]
role_path                 "/tmp/chef-solo/roles"

/tmpはちょっとアレなので、”%s/tmp/var/” で全部/varにしてやります。
んま、そんなこんなでクックブックのhogeを作ります。

# cd /var/chef-solo/cookbooks
# knife cookbook create hoge -o ./
WARNING: No knife configuration file found
** Creating cookbook hoge
** Creating README for cookbook: hoge
** Creating CHANGELOG for cookbook: hoge
** Creating metadata for cookbook: hoge

クックブックを作ったディレクトリに行ってみると↓のような感じ

cd /var/chef-solo/cookbooks/hoge
# ls -l
total 44
drwxr-xr-x 2 root root 4096 Feb 22 13:34 attributes
-rw-r--r-- 1 root root  406 Feb 22 13:34 CHANGELOG.md
drwxr-xr-x 2 root root 4096 Feb 22 13:34 definitions
drwxr-xr-x 3 root root 4096 Feb 22 13:34 files
drwxr-xr-x 2 root root 4096 Feb 22 13:34 libraries
-rw-r--r-- 1 root root  272 Feb 22 13:34 metadata.rb
drwxr-xr-x 2 root root 4096 Feb 22 13:34 providers
-rw-r--r-- 1 root root 1431 Feb 22 13:34 README.md
drwxr-xr-x 2 root root 4096 Feb 22 13:34 recipes
drwxr-xr-x 2 root root 4096 Feb 22 13:34 resources
drwxr-xr-x 3 root root 4096 Feb 22 13:34 templates

でもって、chef-soloを叩いてみると、以下のようにエラーが出なくなりました。

# chef-solo -c /var/chef-solo/solo.rb -j /root/.chef/chef.json
Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Converging 0 resources
Chef Client finished, 0 resources updated

クックブックの中に何もレシピないので0 resoures updatedです。
 
 
■ CouchBaseをインストール
 
とりあえず、当てずっぽうに、default.rbで↓やってみますw

#
# Cookbook Name:: hoge
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "couchbase" do
  action :install
end

↓怒られました…。バージョン書いてないとかそんな感じっぽい。

Recipe: hoge::default
  * package[couchbase] action install
    * No version specified, and no candidate version available for couchbase
================================================================================
Error executing action `install` on resource 'package[couchbase]'
================================================================================


Chef::Exceptions::Package
-------------------------
No version specified, and no candidate version available for couchbase


Resource Declaration:
---------------------
# In /var/chef-solo/cookbooks/hoge/recipes/default.rb

  9: package "couchbase" do
 10:   action :install
 11: end



Compiled Resource:
------------------
# Declared in /var/chef-solo/cookbooks/hoge/recipes/default.rb:9:in `from_file'

package("couchbase") do
  action [:install]
  retries 0
  retry_delay 2
  package_name "couchbase"
  cookbook_name :hoge
  recipe_name "default"
end

が、どうもググってくと、CouchBase入れるの、そんなに簡単じゃないみたい。
↓みると結構なボリューム…。
https://github.com/getaroom/chef-couchbase/tree/master/recipes
ってことで、Githubからゴッソリ持ってきて、、

# git fetch git@github.com:getaroom/chef-couchbase.git
remote: Counting objects: 694, done.
remote: Compressing objects: 100% (217/217), done.
remote: Total 694 (delta 412), reused 671 (delta 389)
Receiving objects: 100% (694/694), 107.55 KiB | 48 KiB/s, done.
Resolving deltas: 100% (412/412), done.
From github.com:getaroom/chef-couchbase
 * branch            HEAD       -> FETCH_HEAD

↓のようにしてchef-soloを叩いてみたら、

# chef-solo -c /var/chef-solo/solo.rb -j /root/.chef/chef.json

↓で落ちて、調べても分からず、ドハマリ…。

================================================================================
Recipe Compile Error in /var/chef-solo/cookbooks/couchbase/libraries/bucket_resource.rb
================================================================================


NoMethodError
-------------
undefined method `attribute' for Chef::Resource::CouchbaseBucket:Class


Cookbook Trace:
---------------
  /var/chef-solo/cookbooks/couchbase/libraries/bucket_resource.rb:9:in `'
  /var/chef-solo/cookbooks/couchbase/libraries/bucket_resource.rb:6:in `'
  /var/chef-solo/cookbooks/couchbase/libraries/bucket_resource.rb:5:in `'
  /var/chef-solo/cookbooks/couchbase/libraries/bucket_resource.rb:4:in `'


Relevant File Content:
----------------------
/var/chef-solo/cookbooks/couchbase/libraries/bucket_resource.rb:

  2:  require File.join(File.dirname(__FILE__), "credentials_attributes")
  3:
  4:  class Chef
  5:    class Resource
  6:      class CouchbaseBucket >       attribute :bucket, :kind_of => String, :name_attribute => true
 10:        attribute :cluster, :kind_of => String, :default => "default"
 11:        attribute :exists, :kind_of => [TrueClass, FalseClass], :required => true
 12:
 13:        attribute :memory_quota_mb, :kind_of => Integer, :callbacks => {
 14:          "must be at least 100" => lambda { |quota| quota >= 100 },
 15:        }
 16:
 17:        attribute :memory_quota_percent, :kind_of => Numeric, :callbacks => {
 18:          "must be a positive number" => lambda { |percent| percent > 0.0 },

↓とケースが似てるから、Chefの新しいバージョンだからなのかしら、、と。
https://github.com/bryanwb/chef-ark/issues/35
ちなみにバージョンは11.4.0。

# chef-solo -v
Chef: 11.4.0

サクっとgemでUninstallカマします。

# gem uninstall chef

You have requested to uninstall the gem:
	chef-11.4.0
knife-solo-0.2.0 depends on [chef (>= 10.12)]
librarian-0.0.26 depends on [chef (>= 0.10)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn]  Y
Remove executables:
	chef-client, chef-solo, knife, chef-shell, shef, chef-apply

in addition to the gem? [Yn]  Y
Removing chef-client
Removing chef-solo
Removing knife
Removing chef-shell
Removing shef
Removing chef-apply
Successfully uninstalled chef-11.4.0

↓の10.24.0を入れ直します。
http://rubygems.org/gems/chef/versions/10.24.0

# gem install chef -v 10.24.0
Fetching: bunny-0.7.9.gem (100%)
[Version 0.7.8] test suite cleanup (eliminated some race conditions related to queue.message_count)
Fetching: moneta-0.6.0.gem (100%)
Fetching: uuidtools-2.1.3.gem (100%)
Fetching: chef-10.24.0.gem (100%)
Successfully installed bunny-0.7.9
Successfully installed moneta-0.6.0
Successfully installed uuidtools-2.1.3
Successfully installed chef-10.24.0
4 gems installed

んでchef-soloを再び叩くと、、401 Unauthorizedって言われる。
どうも外にファイルを取りに行ってるようです。

================================================================================
Error executing action `create_if_missing` on resource 'remote_file[/var/chef-solo/couchbase-server-community_x86_64_1.8.0.deb]'
================================================================================

Net::HTTPServerException
------------------------
401 "Unauthorized"

Resource Declaration:
---------------------
# In /var/chef-solo/cookbooks/couchbase/recipes/server.rb

 27: remote_file File.join(Chef::Config[:file_cache_path], node['couchbase']['server']['package_file']) do
 28:   source node['couchbase']['server']['package_full_url']
 29:   action :create_if_missing
 30: end
 31:

Compiled Resource:
------------------
# Declared in /var/chef-solo/cookbooks/couchbase/recipes/server.rb:27:in `from_file'

remote_file("/var/chef-solo/couchbase-server-community_x86_64_1.8.0.deb") do
  provider Chef::Provider::RemoteFile
  action [:create_if_missing]
  retries 0
  retry_delay 2
  path "/var/chef-solo/couchbase-server-community_x86_64_1.8.0.deb"
  backup 5
  source "http://packages.couchbase.com/releases/1.8.0/couchbase-server-community_x86_64_1.8.0.deb"
  cookbook_name :couchbase
  recipe_name "server"
end

[2013-02-22T13:42:04+09:00] ERROR: Running exception handlers
[2013-02-22T13:42:04+09:00] ERROR: Exception handlers complete
[2013-02-22T13:42:04+09:00] FATAL: Stacktrace dumped to /var/chef-solo/chef-stacktrace.out
[2013-02-22T13:42:04+09:00] FATAL: Net::HTTPServerException: remote_file[/var/chef-solo/couchbase-server-community_x86_64_1.8.0.deb] (couchbase::server line 27) had an error: Net::HTTPServerException: 401 "Unauthorized"

ということで、プロキシの設定をsolo.rbに追加して再びchef-solo叩いたら上記はクリア。

http_proxy "http://ホスト名:ポート"
https_proxy "http://ホスト名:ポート"

が、今度はローカルっぽいところで400 Bad Request..

================================================================================
Error executing action `modify` on resource 'couchbase_settings[web]'
================================================================================

Net::HTTPServerException
------------------------
400 "Bad Request"

Cookbook Trace:
---------------
/var/chef-solo/cookbooks/couchbase/libraries/client.rb:12:in `post'
/var/chef-solo/cookbooks/couchbase/libraries/settings_provider.rb:17:in `action_modify'

Resource Declaration:
---------------------
# In /var/chef-solo/cookbooks/couchbase/recipes/server.rb

 80: couchbase_settings "web" do
 81:   settings({
 82:     "username" => node['couchbase']['server']['username'],
 83:     "password" => node['couchbase']['server']['password'],
 84:     "port" => 8091,
 85:   })
 86:
 87:   username node['couchbase']['server']['username']
 88:   password node['couchbase']['server']['password']
 89: end

Compiled Resource:
------------------
# Declared in /var/chef-solo/cookbooks/couchbase/recipes/server.rb:80:in `from_file'

couchbase_settings("web") do
  action :modify
  retries 0
  retry_delay 2
  cookbook_name :couchbase
  recipe_name "server"
  settings {"username"=>"Administrator", "password"=>"", "port"=>8091}
  username "Administrator"
  group "web"
end

↓ブラウザから見ると大丈夫そうに見えるのですが、、、

時間もないのでCouchBaseのサーバーの設定のレシピをコメントアウトして、
とにかく先に進む事にしました。。

 80 #couchbase_settings "web" do
 81 #  settings({
 82 #    "username" => node['couchbase']['server']['username'],
 83 #    "password" => node['couchbase']['server']['password'],
 84 #    "port" => 8091,
 85 #  })
 86 #
 87 #  username node['couchbase']['server']['username']
 88 #  password node['couchbase']['server']['password']
 89 #end

今度はtest_buckets.rbっていうテストのレシピで…orz

================================================================================
Error executing action `create` on resource 'couchbase_bucket[modified % creation]'
================================================================================

NoMethodError
-------------
undefined method `[]' for nil:NilClass

Cookbook Trace:
---------------
/var/chef-solo/cookbooks/couchbase/libraries/cluster_data.rb:6:in `pool_memory_quota_mb'
/var/chef-solo/cookbooks/couchbase/libraries/bucket_provider.rb:68:in `new_memory_quota_mb'
/var/chef-solo/cookbooks/couchbase/libraries/bucket_provider.rb:52:in `create_params'
/var/chef-solo/cookbooks/couchbase/libraries/bucket_provider.rb:35:in `create_bucket'
/var/chef-solo/cookbooks/couchbase/libraries/bucket_provider.rb:26:in `action_create'

Resource Declaration:
---------------------
# In /var/chef-solo/cookbooks/couchbase/recipes/test_buckets.rb

 52: couchbase_bucket "modified % creation" do
 53:   bucket "modified_percent"
 54:   type "couchbase"
 55:   memory_quota_percent 0.1
 56:
 57:   username node['couchbase']['server']['username']
 58:   password node['couchbase']['server']['password']
 59: end
 60:

Compiled Resource:
------------------
# Declared in /var/chef-solo/cookbooks/couchbase/recipes/test_buckets.rb:52:in `from_file'

couchbase_bucket("modified % creation") do
  action :create
  retries 0
  retry_delay 2
  cookbook_name :couchbase
  recipe_name "test_buckets"
  username "Administrator"
  type "couchbase"
  bucket "modified_percent"
  memory_quota_percent 0.1
  cluster "default"
end

諸事情で個人的にタイムアップになってしまったので、
node設定ののJSONからtest_bucketsを除く形にして、、、、w

{
  "run_list": [
    "recipe[couchbase]",
    "recipe[couchbase::server]",
    "recipe[couchbase::client]"
  ]
}

↓のようにchef-soloを叩きなおすと、、、

# chef-solo -c /var/chef-solo/solo.rb -j /root/.chef/chef.json
[2013-02-22T13:55:37+09:00] INFO: *** Chef 10.24.0 ***
[2013-02-22T13:55:38+09:00] INFO: Setting the run_list to ["recipe[couchbase]", "recipe[couchbase::server]", "recipe[couchbase::client]"] from JSON
[2013-02-22T13:55:38+09:00] INFO: Run List is [recipe[couchbase], recipe[couchbase::server], recipe[couchbase::client]]
[2013-02-22T13:55:38+09:00] INFO: Run List expands to [couchbase, couchbase::server, couchbase::client]
[2013-02-22T13:55:38+09:00] INFO: Starting Chef Run for hoge
[2013-02-22T13:55:38+09:00] INFO: Running start handlers
[2013-02-22T13:55:38+09:00] INFO: Start handlers complete.
[2013-02-22T13:55:38+09:00] INFO: Processing remote_file[/var/chef-solo/couchbase-server-community_x86_64_1.8.0.deb] action create_if_missing (couchbase::server line 27)
[2013-02-22T13:55:38+09:00] INFO: Processing dpkg_package[/var/chef-solo/couchbase-server-community_x86_64_1.8.0.deb] action install (couchbase::server line 32)
[2013-02-22T13:55:38+09:00] INFO: Processing service[couchbase-server] action enable (couchbase::server line 34)
[2013-02-22T13:55:38+09:00] INFO: Processing service[couchbase-server] action start (couchbase::server line 34)
[2013-02-22T13:55:38+09:00] INFO: Processing directory[/opt/couchbase/var/lib/couchbase/logs] action create (couchbase::server line 39)
[2013-02-22T13:55:38+09:00] INFO: Processing ruby_block[rewrite_couchbase_log_dir_config] action create (couchbase::server line 46)
[2013-02-22T13:55:38+09:00] INFO: Processing directory[/opt/couchbase/var/lib/couchbase/data] action create (couchbase::server line 59)
[2013-02-22T13:55:38+09:00] INFO: Processing couchbase_node[self] action modify (couchbase::server line 66)
[2013-02-22T13:55:38+09:00] INFO: Processing couchbase_cluster[default] action create_if_missing (couchbase::server line 73)
[2013-02-22T13:55:38+09:00] INFO: couchbase_cluster[default] created
[2013-02-22T13:55:38+09:00] INFO: Processing remote_file[/var/chef-solo/libvbucket1_1.8.0.4-1_amd64.deb] action create_if_missing (couchbase::client line 33)
[2013-02-22T13:55:38+09:00] INFO: Processing dpkg_package[/var/chef-solo/libvbucket1_1.8.0.4-1_amd64.deb] action install (couchbase::client line 38)
[2013-02-22T13:55:38+09:00] INFO: Processing remote_file[/var/chef-solo/libvbucket-dev_1.8.0.4-1_amd64.deb] action create_if_missing (couchbase::client line 33)
[2013-02-22T13:55:38+09:00] INFO: Processing dpkg_package[/var/chef-solo/libvbucket-dev_1.8.0.4-1_amd64.deb] action install (couchbase::client line 38)
[2013-02-22T13:55:38+09:00] INFO: Processing remote_file[/var/chef-solo/libcouchbase1_1.0.4-1_amd64.deb] action create_if_missing (couchbase::client line 33)
[2013-02-22T13:55:38+09:00] INFO: Processing dpkg_package[/var/chef-solo/libcouchbase1_1.0.4-1_amd64.deb] action install (couchbase::client line 38)
[2013-02-22T13:55:38+09:00] INFO: Processing remote_file[/var/chef-solo/libcouchbase-dev_1.0.4-1_amd64.deb] action create_if_missing (couchbase::client line 33)
[2013-02-22T13:55:38+09:00] INFO: Processing dpkg_package[/var/chef-solo/libcouchbase-dev_1.0.4-1_amd64.deb] action install (couchbase::client line 38)
[2013-02-22T13:55:38+09:00] INFO: Chef Run complete in 0.397096206 seconds
[2013-02-22T13:55:38+09:00] INFO: Running report handlers
[2013-02-22T13:55:38+09:00] INFO: Report handlers complete
# echo $?
0

んま、一応リターンコードがゼロという事で…ww
 
本当はFull Text Searchするところまでやりたかったのですが、到底及ばす…。
業務の空いた時間にチャチャッと出来るほど甘くはないかと…orz
ってか、2.0触ってみたかったのに、Couchbase Server 1.8.0がインストールされてます…。
 
まぁ、Chefに触れて、どんなもんかは少し分かった気がするので、
PHPerにも出来た 初めてのChef教室(http://kokucheese.com/event/index/74459/) 楽しみです!
#って、用事があって途中退席してしまうのですが…汗
 

Amazon Web Services クラウドデザインパターン 設計ガイド
玉川 憲 片山 暁雄 鈴木 宏康
日経BP社
売り上げランキング: 2,641

コメント

タイトルとURLをコピーしました