nigoblog

技術系会社のCEOブログ~私的編~

MySQL5.6のchefの書き方の決定版が出来たので公開する。

chefでサーバーの構築をプログラマブルにやるっていうのはもうだいぶ昔から定番になってきています。

今回は特にMySQL 5.6のインストールをchefで行う場合のケースについて書いていきます。
MySQL5.6はインストールがなかなかめんどくさく、chefを使わなくても結構大変です。

だがしかし、度重なる試行錯誤の末、ついにMySQL5.6をchefでインストールする決定版が出来たため、公開しようと思います!

ただし、今回はEC2 + RDS等、webサーバーとDBサーバーを分けて、かつEC2(webサーバー)のみにMySQL5.6をインストールする場合のことを書いていきます。

ちなみにserverはCentOSを想定していますのでubuntuの方はすみません

  1. そもそもchefとは
  2. MySQL5.6を単純にインストールする場合
  3. MySQL5.6をchefでインストールする
  4. まとめ

そもそもchefとは

このブログでもなんども言及していますが、サーバー構築を自動化してくれるツールです。
chefserverをたてるケースや、chef soloを利用するケースがあります。
対象サーバーが1台くらいならばchef soloを利用しても構わないでしょう。
chef soloの使い方に関してはこちらの記事が役立ちます。
ChefでRaspberry Piをセットアップする - naoty.to_s

MySQL5.6を単純にインストールする場合

仮にchefを使わない場合こうなります。

cd /tmp
wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-5.6.13-1.el6.x86_64.rpm-bundle.tar
tar xf MySQL-5.6.13-1.el6.x86_64.rpm-bundle.tar
sudo yum remove mysql mysql-server
sudo yum localinstall MySQL-shared-compat-5.6.13-1.el6.x86_64.rpm
sudo yum localinstall MySQL-shared-5.6.13-1.el6.x86_64.rpm
sudo yum localinstall MySQL-server-5.6.13-1.el6.x86_64.rpm 
sudo yum localinstall MySQL-devel-5.6.13-1.el6.x86_64.rpm 
sudo yum localinstall MySQL-client-5.6.13-1.el6.x86_64.rpm 
sudo cat /root/.mysql_secret
/etc/init.d/mysql start
mysql -u root -p
set password = PASSWORD('password');

ざーっと殴り書きですがこんな感じ。
RPMパッケージをwgetで取得し、tarで解凍。
それぞれyumでinstallします。
ちなみにこれはMySQL serverもインストールする場合。
今回のケースはMySQL-client, MySQL-devel, MYSQL-shareのみでオッケーです。

MySQL5.6をchefでインストールする

まず最低限の構造は次のようになります

mysql/
/attributes
default.rb
/recipes
default.rb

このような構造
まずattributesから説明します
attributes/default.rbは次のようになります

default['mysql']['versions']   = "5.6.13-1.el6.x86_64"
default['mysql']['file_name']  = "MySQL-5.6.13-1.el6.x86_64.rpm-bundle.tar"
default['mysql']['remote_uri'] = "http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-5.6.13-1.el6.x86_64.rpm-bundle.tar"
default['mysql']['rpm'] = [
  {
    :rpm_file     => "MySQL-client-5.6.13-1.el6.x86_64.rpm",
    :package_name => "MySQL-client"
  },
  {
    :rpm_file     => "MySQL-devel-5.6.13-1.el6.x86_64.rpm",
    :package_name => "MySQL-devel"
  },
  {
    :rpm_file     => "MySQL-shared-5.6.13-1.el6.x86_64.rpm",
    :package_name => "MySQL-shared"
  }
]

とりあえずここはこんな感じでコピペしてしまうとよいでしょう。
ポイントは基本的にパッケージやRPMのURLなんかはattributesに書いておくとよいでしょう。

次はrecipes/default.rbです

remote_file "/tmp/#{node['mysql']['file_name']}" do
  source "#{node['mysql']['remote_uri']}"
end

bash "install_mysql" do
  user "root"
  cwd "/tmp"
  code <<-EOH
    tar xf "#{node['mysql']['file_name']}"
  EOH
end

node['mysql']['rpm'].each do |rpm|
  package rpm[:package_name] do
    action :install
    provider Chef::Provider::Package::Rpm
    source "/tmp/#{rpm[:rpm_file]}"
  end
end

というわけでたったこれだけで出来ます!

recipes/default.rbから説明すると
まずrpmパッケージをインストールします。

remote_file "/tmp/#{node['mysql']['file_name']}" do
  source "#{node['mysql']['remote_uri']}"
end

ここはchefを使わない場合の

cd /tmp
wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-5.6.13-1.el6.x86_64.rpm-bundle.tar

を表しています。
次にtarを解凍します。

bash "install_mysql" do
  user "root"
  cwd "/tmp"
  code <<-EOH
    tar xf "#{node['mysql']['file_name']}"
  EOH
end

ここはbashというリソースを使います。

tar xf MySQL-5.6.13-1.el6.x86_64.rpm-bundle.tar

これを行っています。
ちなみにbashというリソースは万能ですが、
ここでwgetを行うとたびたび失敗します。
出来る奴もありますが、MySQL5.6に限っては確実に失敗します。


最後にインストールです。

node['mysql']['rpm'].each do |rpm|
  package rpm[:package_name] do
    action :install
    provider Chef::Provider::Package::Rpm
    source "/tmp/#{rpm[:rpm_file]}"
  end
end

パッケージリソースにprovider Chef::Provider::Package::Rpmというオプションを使います。
これは

sudo yum localinstall MySQL-shared-5.6.13-1.el6.x86_64.rpm
sudo yum localinstall MySQL-devel-5.6.13-1.el6.x86_64.rpm 
sudo yum localinstall MySQL-client-5.6.13-1.el6.x86_64.rpm 

これを表します。

まとめ

というわけで色々な資料を参考に決定版を作成しました。
なんだかんだいって一番ためになるのはchefの公式ドキュメントだったりします。

あとはattributesにどんなことを書くかというのはポイントかと。
個人的にRPMのURLや、ファイル名バージョンなどはattributesに書くといいかと思います。
さらに最適化するならば、

versions = "5.6.13-1.el6.x86_64"
default['mysql']['file_name']  = "MySQL-#{versions}.rpm-bundle.tar"

のような書き方もありかと思います。

chefってなかなか決定版がないので、これを気にオリジナルの決定版を探っていくとよいかと思います。
とりあえずMySQL5.6のchefに関しては今回の記事を参考にしていただけると幸いです!

参考図書

chefの基本ならこれ!

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code