[Chef] infoScoopのレシピを作ってみる②

| コメントをどうぞ

infoScoopのレシピを作ってみる①

前回で必要なリソースの調べがついたので、実際にinfoScoopのレシピ(CookBook)を作ってみました。 以下はCookBookの構成です。

/infoscoop
|
├─attributes
│     default.rb
|
├─definitions
├─files
│ └─default
│     infoscoop-opensource-3.4.0.tar.gz
│
├─libraries
├─providers
├─recipes
│     default.rb
│     mysql.rb
│     tomcat7.rb
│
├─resources
└─templates
 └─default
      infoscoop.xml.erb
      my.cnf.erb

動作確認環境は CentOS 6.5。 infoScoop OpenSourceサイトからダウンロードしたtar.gzファイルを使ってリポジトリDBの初期化、Tomcatへのデプロイまで行います。 急拵えなので、冪等性や設定値(Attribute)などは適当です。このへんは後々対応していきたいと思います。

 attributes/default.rb

バージョンやモジュールのパスなど、外に出せるものはAttributeとして定義しています。

# インストール対象infoScoopのバージョン。
default["infoscoop"]["version"]="3.4.0"

# files/default 以下のinfoScoopモジュールのパスを指定。
default["infoscoop"]["module_path"]="infoscoop-opensource-3.4.0.tar.gz"

 files/default/infoscoop-opensource-3.4.0.tar.gz

infoScoopのインストールモジュール。上述のAttributeで指定されたバージョンのtar.gzファイルを配置します。

 recipes/default.rb

デフォルトで実行されるレシピ。 インストールモジュールのコピーと展開、インポートツールの実行、データベース作成、WARの作成とTomcatへの配備を行います。 データベース作成は execute リソースで無理矢理行っていいますが、 公開されているレシピで使えるものがあるかも知れません(あまり調べてない)。 ツール実行に必要な Ant は、 package リソースでインストールしています。

version = node["infoscoop"]["version"]
module_path = node["infoscoop"]["module_path"]
infoscoop_dir = "/tmp/infoscoop-opensource-#{version}"

# 1. MySQLセットアップ
include_recipe "infoscoop::mysql"

# 2. Tomcat7セットアップ
include_recipe "infoscoop::tomcat7"

# 3. モジュールのコピー
cookbook_file "/tmp/infoscoop.tar.gz" do
 source "#{module_path}"
 mode 0644
end

# 4. モジュールの展開
execute "untar-infoscoop" do
 command "tar -zxf /tmp/infoscoop.tar.gz -C /tmp"
end

# 5. データベース作成
execute "mysql-create-database" do
 command <<-EOH
 mysql -u root -e "create database iscoop character set utf8;"
 mysql -u root iscoop < #{infoscoop_dir}/tools/initdb/schema/mysql/mysqlinit.sql
 EOH
 # 存在チェック
 not_if { File.exists?("/var/lib/mysql/iscoop") }
end

# 6. Antインストール
package "ant" do
 action :install
end

# 7. インポートツールの実行
execute "init-infoscoop" do
 cwd "#{infoscoop_dir}/tools/initdb"
 environment "JAVA_HOME" => "/usr/lib/jvm/jre"
 command "./import.sh"
 creates "#{infoscoop_dir}/tools/initdb/infoscoop.log"
end

# 8. WARの作成
execute "remakewar-infoscoop" do
 cwd "#{infoscoop_dir}/infoscoop"
 environment ({"JAVA_HOME" => "/usr/lib/jvm/jre", "ANT_HOME" => "/usr/share/ant"})
 command "./remakewar.sh"
end

# 9. WARの配備
execute "deploy-infoscoop" do
 command "mv #{infoscoop_dir}/infoscoop/dist/infoscoop.war /usr/share/tomcat7/webapps"
 creates "/usr/share/tomcat7/webapps/infoscoop.war"
end

# 10. Tomcatリスタート
service "tomcat7" do
 supports status: true, restart: true, reload: true
 action [ :enable, :restart ]
end

 recipes/tomcat7.rb

Tomcatセットアップ用のレシピ。 opscodeで公開されているものもありましたが、Tomcat7が上手く入らなかったため自作。 Tomcat7インストール用リポジトリ(JPackage)の追加とインストール、コンテキストファイル(infoscoop.xml)の配置を行っています。 ついでにMySQL用JDBCドライバのインストールと $TOMCAT_HOME/lib へのシンボリックリンク設定も行っています。

# リポジトリ(JPackage)の追加
package "yum-plugin-priorities" do
 action :install
end
remote_file "/tmp/jpackage-release-6-3.jpp6.noarch.rpm" do
 source "http://mirrors.dotsrc.org/jpackage/6.0/generic/free/RPMS/jpackage-release-6-3.jpp6.noarch.rpm"
 mode 00644
end
rpm_package "jpackage-release-6-3" do
 source "/tmp/jpackage-release-6-3.jpp6.noarch.rpm"
 options "-Uvh"
 action :install
end

# Tomcatインストール
package "tomcat7" do
 options "--nogpgcheck"
 action :install
end

# templateによるinfoscoop.xml置き換え
template "/usr/share/tomcat7/conf/Catalina/localhost/infoscoop.xml" do
 source "infoscoop.xml.erb"
 owner "tomcat"
 group "tomcat"
 mode "0644"
end

# mysql-connectorインストール
package "mysql-connector-java" do
 action :install
end

# mysql-connectorのシンボリックリンク作成
link "/usr/share/tomcat7/lib/mysql-connector-java.jar" do
 action :delete
end
execute "mysql-connector-symboliclink" do
 command "ln -s /usr/share/java/mysql-connector-java-*.jar /usr/share/tomcat7/lib/mysql-connector-java.jar"
 creates "/usr/share/tomcat7/lib/mysql-connector-java.jar"
end

  recipes/mysql.rb

MySQLセットアップ用のレシピ。 opscodeで公開されているものが普通に使えますが、せっかくだから自作。 packageリソースでインストールを行い、templateリソースでmy.cnfを置き換えています。 最後にMySQLを起動していますが、これは呼び元(default.rb)で書けばよかった気がします。

# MySQLインストール
%w{mysql mysql-devel mysql-server}.each do |package_name|
 package package_name do
 action :install
 end
end

# templateによるmy.cnf置き換え
template "/etc/my.cnf" do
 source "my.cnf.erb"
 owner "mysql"
 group "mysql"
 mode "0644"
end

# MySQLスタート
service "mysqld" do
 supports status: true, restart: true, reload: true
 action [ :enable, :start ]
end

 templates/default/infoscoop.xml.erb

コンテキスト設定ファイルのテンプレートです。 完全に静的ファイルですが、APサーバ用のパラメータやデータソースのURLなどを外部から指定して動的に変更するのが本来あるべき使い方です。これも後々改修したい。

<?xml version='1.0' encoding='utf-8'?>
<Context path="/infoscoop" clearReferencesStopThreads="true">
 <Resource name="jdbc/infoscoop" auth="Container"
 type="javax.sql.DataSource"
 username="root"
 password=""
 driverClassName="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/iscoop"
 validationQuery="select 1" />
</Context>

 templates/default/my.cnf.erb

MySQL設定ファイル(my.cnf)のテンプレートです。

デフォルトの my.cnf に lower_case_table_names=1 の設定を加えたものです。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
lower_case_table_names=1

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

実行してみる

knife-soloを使って実行してみます。環境作成についてはここを参照。

[0mChef Client finished, 22/23 resources updated in 657.054178394 seconds [0em

657秒ほどで終了しました。Tomcatにアクセスし、infoScoopが正常に稼働することを確認。

おわりに

少しかじった程度の知識ですが、どうにか初歩的なレシピの作成までは出来たようです。

まだまだ改修の余地はありますが、とりあえずGitHubにアップしておきます。

ゆくゆくはバージョンアップして実用レベルできればと思います。

(個人で作った非公式なものですので、ご利用は自己責任で)

コメントを残す

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

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