Chefでvagrantにサーバー構築②(レシピ作成編)
やること
昨日の記事の続きです。
今度はvagrantにインストールした各ソフトウェアの設定を自動化します。
レシピとクックブックの違い 実際の本を考えると分かりやすいですが、クックブックはレシピが複数集まったものです。つまり、クックブックはレシピファイルが集まったもののことです。
流れ
- sql文を書いたテンプレートファイルの作成
- site-cookbooks/staging_cookbook/attributes/default.rbに各変数を配置
- 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の設定の自動化です。