ようへいの日々精進XP

よかろうもん

Community Cookbooks 探訪(2)- memcached

要件

  • Community Cookbooks の中から一つの cookbook を選んでどんな事が書いてあるか読み解く
  • 先人たちの叡智を吸収して、cookbook 作成スキルをアップしたい

注意点

  • まずは usage を個人的な意訳メモですのでご了承下さい!

今日のメニュー

概要

  • memcached パッケージを対象 node に導入するシンプルな cookbook
  • ohai を使い OS におけるパッケージ管理コマンドの違い等を吸収している

git より clone

$ git clone https://github.com/opscode-cookbooks/memcached.git

cookbook の構造

$ tree
.
├── CHANGELOG.md
├── CONTRIBUTING
├── Gemfile
├── LICENSE
├── README.md
├── attributes
│   └── default.rb
├── definitions
│   └── memcached_instance.rb
├── metadata.rb
├── recipes
│   └── default.rb
├── templates
│   └── default
│       ├── memcached.conf.erb
│       ├── memcached.default.erb
│       ├── memcached.sysconfig.erb
│       ├── sv-memcached-log-run.erb
│       └── sv-memcached-run.erb
└── test
    └── kitchen
        ├── Kitchenfile
        └── cookbooks
            ├── Cheffile
            └── memcached_test
                ├── README.md
                ├── metadata.rb
                └── recipes
                    ├── default.rb
                    └── instance.rb

使い方

  • 基本的に runlist に追加して利用する

ぢゃあ、いったい何をやっているのか?

レシピ、コードを読んでみる

recipes/default.rb
 21 if node['platform_family'] == "rhel" and node['platform_version'].to_i < 6
 22  include_recipe "yum::epel"
 23 end
 24 
 25 package "memcached" do
 26   action :install
 27 end
 28 
 29 package "libmemcache-dev" do
 30   case node['platform_family']
 31   when "rhel", "fedora"
 32     package_name "libmemcached-devel"
 33   when "smartos"
 34     package_name "libmemcached"
 35   else
 36     package_name "libmemcache-dev"
 37   end
 38   action :install
 39 end
  • 21 行目から... ohai で取得した platform_family をチェックして rhel = RedHat 系 で且つ version が 6 以下の node であれば yum::epel レシピを include する
  • 25 行目は単純な memcached のインストール
  • 29 行目以降、libmemcache-dev パッケージの導入に際して 21 行目同様に OS の環境をチェックしてパッケージ名を調節している
 41 service "memcached" do
 42   action :nothing
 43   supports :status => true, :start => true, :stop => true, :restart => true
 44 end
  • 言わずもがな service の自動起動を設定する
  • ただし、action :nothing となっているので後述の設定ファイルの設置に記載されている notifies :restart にて実行される
 46 case node['platform_family']
 47 when "rhel", "fedora"
 48   template "/etc/sysconfig/memcached" do
 49     source "memcached.sysconfig.erb"
- 略 -
 53     variables(
 54       :listen => node['memcached']['listen'],
- 略 -
 58       :memory => node['memcached']['memory']
 59     )
 60     notifies :restart, "service[memcached]"
 61   end
 62 when "smartos"
 63   # SMF directly configures memcached with no opportunity to alter settings
 64   # If you need custom parameters, use the memcached_instance provider
 65   service "memcached" do
 66     action :enable
 67   end
 68 else
 69   template "/etc/memcached.conf" do
 70     source "memcached.conf.erb"
- 略 - 
 74     variables(
 75       :listen => node['memcached']['listen'],
- 略 -
 79       :memory => node['memcached']['memory']
 80     )
 81     notifies :restart, "service[memcached]"
 82   end
 83 end
  • パッケージ導入と同じく、ohai の platform_family の値を参考に memcached 自体の設定ファイル設定を行なっている
  • 設定ファイルの中身は attribute に設定した内容を temlate の variables にて上書きをしている
  • 設定ファイルを設置した後、`notifies :restart, "service[memcached]"` で memacached のサービスを再起動している
  • 途中に `when "smartos"` とあるが、smartos ってそもそも何だろ?って話なので、別途で調査をする
memcached/attributes/default.rb
 20 default['memcached']['memory'] = 64
 21 default['memcached']['port'] = 11211
 22 default['memcached']['user'] = "nobody"
 23 default['memcached']['listen'] = "0.0.0.0"
 24 default['memcached']['maxconn'] = 1024
  • デフォルトでは上記の値が設定されている
  • 環境に応じて適宜書き換える
memcached/templates/default
$ tree
.
├── memcached.conf.erb
├── memcached.default.erb
├── memcached.sysconfig.erb
├── sv-memcached-log-run.erb
└── sv-memcached-run.erb

まとめ

  • シンプルだけど cookbook 初心者の自分でも attribute とか template の使い方や ohai の役割等が分り易い cookbook だった
  • また service の action :nothing からの notifies :restart についても理解し易かった