Chef/初心者向けChef入門講座/独自リソースでDB管理(その1)


独自リソースでDB管理(その1)

データベースを作成する際にこんなレシピ(というかここではmysql_databaseというリソース)が使えたら便利ではないですか?
mysql_database "dbname" do
  host "127.0.0.1"
  user "dbuser"
  password "SeCReT"
  action :create
end
僕だけですか。そうですか。

気にせず進めますが、Chefのレシピ(というかcookbook)は結構いろんな人が作って公開している物があります。
databaseに関してもこのようなcookbookがあるようです。
が、誰か偉い人がレシピは持って来て使うより自分で書いた方がいいって言ってた気がするので、リソースに関しても自分で作ってみたいと思います。

リソースの設計

実際は設計というほど大したことではないですが、そのリソースを実際に使う時にどういった情報が必要かどうかは予め整理しておきましょう。
例えば今回の例で言えばやりたいことはデータベースの操作ですから、普通に考えたらDB名、接続先host、ユーザー名、パスワードという情報は少なくとも必要と思われます。

実際の運用環境によってはポート番号がバラバラに設定されていることもあるでしょうし、ひょっとしたらユーザー名やパスワードは全環境で統一されていてわざわざ個別に書く必要は無いかもしれません。
記述する情報は多岐に渡るとは思いますが、とりあえずそのリソースを使う場合に必須な情報と、任意の情報(デフォルト値が定まっている情報)に分けて洗い出しておきましょう。

それと、そのリソースに対してどういったアクションが必要なのかということです。
データベースなのでとりあえず作成と削除があれば良さそうです。

今回は、
必須 DB名、接続先host
任意 ユーザー名、パスワード、ポート番号
アクション 作成、削除
としておきます。

リソースの定義

情報の洗い出しが終わったら実際にリソースの定義を行います。
が、その前に今回は新たにcookbookを作ってからにしておきます。
既存のcookbookに定義する場合は作らなくて良いです。
$ cd ~/chef/cookbooks
$ knife cookbook create mysql -o .

リソース定義はcookbookディレクトリのresourcesディレクトリに任意のファイル名のファイルを作成して行います。
レシピ内で記述するリソース名はcookbook名とファイル名を_(アンダーバー)で繋いだ物になります。
今回はmysqlというcookbookにdatabase.rbというファイルを作りますので、

mysql_database

というリソースが定義されます。

実際のファイルはこんな感じです。
~/chef/cookbooks/mysql/resources/database.rb
actions :create, :drop
default_action :create
attribute :name, :kind_of => String, :name_attribute => true
attribute :host, :required => true, :kind_of => String
attribute :user, :default => 'root', :kind_of => String
attribute :pass, :default => 'SeCReT', :kind_of => String
attribute :port, :default => 3306, :kind_of => Integer

内容自体はなんとなく見れば分かるとは思いますが、一応説明します。

actions :create, :drop
default_action :create
actionsではどういったactionが存在するのかを定義し、default_actionではレシピでactionを指定しなかった際のデフォルトのactionを指定しています。

attribute :name, :kind_of => String, :name_attribute => true
ここでは当該リソースにアトリビュートを定義しています。
アトリビュート名は任意ですが、ここでは:nameという名称にしています。
また、:kind_ofでこのアトリビュートのデータ型を。
:name_attribute => true とすることで、このアトリビュートがネームアトリビュートであることを宣言しています。

ネームアトリビュートとはどういうことかと言うと、例えばこのページで最初に定義したこのレシピ。
mysql_database "dbname" do
  host "127.0.0.1"
  user "dbuser"
  password "SeCReT"
  action :create
end
ここではmysql_databaseというリソースに続いて指定している"dbname"というパラメータ。
これがネームアトリビュートです。
ここで入力している値が :name_attribute => true のアトリビュートに格納されます。

あとはまとめて。
attribute :host, :required => true, :kind_of => String
attribute :user, :default => 'root', :kind_of => String
attribute :pass, :default => 'SeCReT', :kind_of => String
attribute :port, :default => 3306, :kind_of => Integer
それぞれ:host, :user, :pass, :portというアトリビュートを定義しています。
:required => true となっている物は必須項目ですので、レシピ側で指定しないとエラーになります。
:default => 値 となっている物は値が入力されていない場合のデフォルト値です。

ここは予め設計が正しく行われていればそれほど難しくないはずです。

actionの記述

続けて実際のactionで行われる処理内容を記述していきます。
処理内容はprovidersというディレクトリの配下にresourceと同名のファイルを作成して記述します。
今回は ~/chef/cookbooks/mysql/providers/database.rb ということになりますね。

actionはcreateとdropなのでそれぞれDB作成、DB削除処理です。
もう少し具体的に言うとmysqlのデータベースに接続した上でCREATE DATABASEかDROP DATABASEのSQLを発行することになりますが、そう考えるとどうやらcreateとdropにはある程度共通の部分がありそうです。
この共通処理を予めライブラリ化しておくと良さそうな気がしてきました。

そんな予感と共に独自リソースでDB管理は一旦ここで中断し、話題をライブラリ作成に移したいと思います。




  • 最終更新:2016-01-19 13:44:20

このWIKIを編集するにはパスワード入力が必要です

認証パスワード