DesignAssembler

備忘録に近い

Chefでvagrantにサーバー構築②(レシピ作成編)

やること

昨日の記事の続きです。

hyottokoaloha.hatenablog.com

今度はvagrantにインストールした各ソフトウェアの設定を自動化します。

  • MySQLのユーザー、データベース作成
  • rubyのインストール(rbenv)
  • railsのインストール

レシピとクックブックの違い 実際の本を考えると分かりやすいですが、クックブックはレシピが複数集まったものです。つまり、クックブックはレシピファイルが集まったもののことです。

流れ

  1. sql文を書いたテンプレートファイルの作成
  2. site-cookbooks/staging_cookbook/attributes/default.rbに各変数を配置
  3. site-cookbooks/staging_cookbook/recipe/mysql_recipe.rbにレシピを書く

MySQLのユーザー、データベース作成

ユーザー、データベース作成とユーザー権限付与は以下のsql文で書きます。

grant all on <データベース名>.* to <ユーザー名>@localhost identified by '<パスワード>’;
create database if not exists <データベース名> default character set utf8;

これに沿ってテンプレートファイルを書きます。

以下3ファイルはsql文のテンプレートファイルです。

site-cookbooks/staging_cookbook/templates/default/create_users.sql.erb

grant all on `<%= node.mysql.develop_db_name %>`.* to <%= node.mysql.develop_user %>@localhost identified by '<%= node.mysql.develop_password %>';

site-cookbooks/staging_cookbook/templates/default/create_databases.sql.erb

create database if not exists <%= node.default['mysql']['develop_db_name'] %> default character set utf8;

変数をsite-cookbooks/develop_cookbook/attributes/default.rbに配置します。

#site-cookbooks/develop_cookbook/attributes/default.rb
node.default['mysql']['develop_user'] = 'dev_user'
node.default['mysql']['develop_password'] = 'develop_password'
node.default['mysql']['develop_db_name'] = 'development'

次に、上のsql文を実行するためのレシピを書きます。

#site-cookbooks/develop_cookbook/recipes/mysql_recipe.rb
#create database
template 'create database sql' do
  path "create_databases.sql"
  source 'create_databases.sql.erb'
  owner node['mysql']['user']
  group node['mysql']['group']
  mode '0644'
end

execute 'exec create database sql' do
  command "mysql -u root --password='#{node['mysql']['server_root_password']}' < create_databases.sql"
  user node['mysql']['user']
  group node['mysql']['group']
  environment 'HOME' => "/home/#{node['mysql']['user']}"
end

#create user
template 'create user sql' do
  path "create_user.sql"
  source 'create_user.sql.erb'
  owner node['mysql']['user']
  group node['mysql']['group']
  mode '0644'
end

execute 'exec create user sql' do
  command "mysql -u root --password='#{node['mysql']['server_root_password']}' < create_user.sql"
  user node['mysql']['user']
  group node['mysql']['group']
  environment 'HOME' => "/home/#{node['mysql']['user']}"
end

上で使っている変数をsite-cookbooks/develop_cookbook/attributes/default.rbに追加します。

#site-cookbooks/develop_cookbook/attributes/default.rb
node.default['mysql']['develop_user'] = 'dev_user'
node.default['mysql']['develop_password'] = 'develop_password'
node.default['mysql']['develop_db_name'] = 'development'
node.default['mysql']['user'] = 'vagrant'
node.default['mysql']['group'] = 'vagrant'

[‘mysql’][‘server_root_password’]はインストールされたcookbooks/mysql/attributes/default.rbにあります。 (デフォルトではilikerandompasswordとなっています)

Vagrantfileにレシピを追加

#site_cookbooksディレクトリをパスに追加
chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]

chef.add_recipe "develop_cookbook::mysql_recipe"

パス関係でかなりハマりました・・・

Railsのインストール

nokogiriに殺されるやつです

以下をsite-cookbooks/develop_cookbook/recipes/ruby_on_rails.rbに追加してください。

['libxml2', 'libxslt', 'libxml2-devel', 'libxslt-devel', 'ruby-devel'].each do |pkg|
  package pkg do
    action :install
  end
end

bash "install rails" do
  code <<-EOC
    gem install json_pure
    gem install nokogiri -- --use-system-libraries
    export PATH="#{node['home_path']}/.rbenv/bin:$PATH"
    eval "$(rbenv init -)"
    gem update --system
    gem install --no-ri --no-rdoc rails
  EOC
end

Vagrantfileに以下を追加してください

chef.add_recipe "develop_cookbook::ruby_on_rails"

これでOKです。

Ruby2.2.2のインストール

インストールにはrbenvを使います。

まずインストールしたいバージョン番号をsite-cookbooks/develop_cookbook/attributes/default.rbに追加してください ここでは2.2.2をインストールします。

次に、レシピファイルをsite-cookbooks/develop_cookbook/recipes/ruby.rbに作成してください。

#install ruby
execute "install ruby #{node['ruby_version']}" do
  not_if "rbenv versions | grep #{node['ruby_version']}"
  command "rbenv install #{node['ruby_version']}"
  action :run
end

#set global ruby
execute "set global ruby #{node['ruby_version'}" do
  not_if "rbenv versions | grep #{node['ruby_version']}"
  command "rbenv global #{node['ruby_version']}"
  action :run
end

そしてVagrantfileに以下を追加します。

chef.add_recipe "develop_cookbook::ruby"

なかなか道のりは長いです・・・ 次はnginx/unicornの設定の自動化です。

参考

dev.classmethod.jp

qiita.com