はじめに
以前の記事
LAMP開発環境の構築方法~仮想環境構築編および、
LAMP開発環境の構築方法~LAMP環境構築編では、仮想環境の構築から、LAMP環境構築の方法について、2回に渡って解説しました。
今回は、サーバー構成管理ツールであるChefを用いたLAMP環境の構築方法について、2回に分けて解説します。
第1回は、Chef環境の構築から仮想マシンの基本設定を行うレシピの実行までを解説します。
Chef環境の構築
- Chefのインストール
初めてChefをインストールする方は、Cygwin + rbenv環境でプロビジョニングサーバーを構築する方法(第2回)~仮想化ソフトウエアを導入し、Chef環境を構築するを参考にして、rbenv環境および、Chefのインストールして下さい。
既に、rubyの実行環境をお持ちの方で、初めてChefをインストールする方はgemパッケージからChefをインストールして下さい。
$ gem i chef --no-ri --no-rdoc
- Chefのアップデート
既に、rubyの実行環境および、Chefをインストール済みの方は、Chefのアップデートを行って下さい。
$ gem update chef $ chef-solo -v
$ gem update chef DL is deprecated, please use Fiddle Updating installed gems Updating chef Fetching: chef-11.8.2.gem (100%) Successfully installed chef-11.8.2 Parsing documentation for chef-11.8.2 Installing ri documentation for chef-11.8.2 Installing darkfish documentation for chef-11.8.2 Done installing documentation for chef after 52 seconds Updating chef-zero Fetching: chef-zero-2.0.1.gem (100%) Successfully installed chef-zero-2.0.1 Parsing documentation for chef-zero-2.0.1 Installing ri documentation for chef-zero-2.0.1 Installing darkfish documentation for chef-zero-2.0.1 Done installing documentation for chef-zero after 3 seconds Gems updated: chef chef-zero
$ chef-solo -v DL is deprecated, please use Fiddle Chef: 11.8.2
- Vagrantプラグインのインストール
ChefがインストールされていないBoxに、Chefを自動的にインストールするvagrant-omnibusプラグインをインストールします。
$ vagrant plugin install vagrant-omnibus
仮想マシンの起動
Chefプロビジョニングを行うBoxを作成し、起動します。
- Boxの起動
LAMP環境構築編で使用したCentOSのBoxイメージを使用して、新しいBoxを起動します。
$ mkdir -p ~/vagrant/chef-lamp && cd ~/vagrant/chef-lamp $ vagrant init chef-lamp
$ mkdir -p ~/vagrant/chef-lamp && cd ~/vagrant/chef-lamp $ vagrant init chef-lamp A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.
Vagrantfileを下記のとおり編集します。
ブリッジネットワークのIPアドレスおよび、ダウンロードするBoxイメージのURLを指定し、起動したBoxに最新版のChefがインストールされるように設定します。$ vi Vagrantfile
config.vm.box_url = "http://files.brianbirkinbine.com/vagrant-centos-65-i386-minimal.box" config.vm.network :public_network, ip: "192.168.0.20" config.vm.synced_folder ".", "/vagrant" config.omnibus.chef_version = :latest
編集が終了したら、Boxを起動します。
Vagrantfileで指定したBoxがダウンロードされ、最新版のChefがインストールされます。
$ vagrant up
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... [default] Box 'chef-lamp' was not found. Fetching box from specified URL for the provider 'virtualbox'. Note that if the URL does not have a box for this provider, you should interrupt Vagrant now and add the box yourself. Otherwise Vagrant will attempt to download the full box prior to discovering this error. Downloading box from URL: http://files.brianbirkinbine.com/vagrant-centos-65-i386-minimal.box Box download is resuming from prior download progress Extracting box...ate: 3542k/s, Estimated time remaining: --:--:--) Successfully added box 'chef-lamp' with provider 'virtualbox'! [default] Importing base box 'chef-lamp'... [default] Matching MAC address for NAT networking... [default] Setting the name of the VM... [default] Clearing any previously set forwarded ports... [default] Fixed port collision for 22 => 2222. Now on port 2200. [default] Clearing any previously set network interfaces... [default] Preparing network interfaces based on configuration... [default] Forwarding ports... [default] -- 22 => 2200 (adapter 1) [default] Booting VM... [default] Waiting for machine to boot. This may take a few minutes... DL is deprecated, please use Fiddle [default] Machine booted and ready! [default] Configuring and enabling network interfaces... [default] Mounting shared folders... [default] -- /vagrant [default] Installing Chef 11.8.2 Omnibus package...
以上で、Chefおよび、Boxの準備ができましたので、LAMP環境構築のためのCookbookを作成します。
仮想マシンの初期設定
Boxの初期設定を行う、Base Cookbookを作成し、Vagrantfileにレシピを追加した後、プロビジョニングを実行します。
- レシピの指定
Vagrantfileを下記のとおり編集します。
実行するCookbookのパスと実行するレシピを指定し、レシピ内で参照する変数を指定しています。$ vi Vagrantfile
config.vm.provision :chef_solo do |chef| chef.cookbooks_path = "./site-cookbooks" chef.add_recipe "base" chef.json = { base: { fqdn: "chef-lamp.vagrantup.com", name: "chef-lamp" }, } end
- Base Cookbookの作成
Base Cookbookを作成します。
$ knife cookbook create base -o site-cookbooks
$ knife cookbook create base -o site-cookbooks ** Creating cookbook base ** Creating README for cookbook: base ** Creating CHANGELOG for cookbook: base ** Creating metadata for cookbook: base
site-cookbooksフォルダ配下に、Cookbookのひな型が作成されますので、レシピを作成します。
ここで作成するレシピは、site-cookbooks/base/recipes/default.rb ファイルに全て記述します。$ vi site-cookbooks/base/recipes/default.rb
- ネットワーク設定
Vagrantfileで指定したFQDNを、設定ファイルに追加します。
FQDNが設定ファイルに登録されていない場合に、スクリプトが実行されます。bash 'network' do user 'root' code <<-EOC sed -i -e 's|HOSTNAME=.*$|HOSTNAME=#{node[:base][:fqdn]}|' /etc/sysconfig/network EOC not_if "grep -q #{node[:base][:fqdn]} /etc/sysconfig/network" end
- ホスト名設定
ネットワーク設定で設定されたFQDNを、ホスト名として設定します。
bash 'hostname' do user 'root' code <<-EOC hostname `grep ^HOSTNAME /etc/sysconfig/network | sed 's/^.*=//'` EOC not_if "grep -q `hostname` /etc/sysconfig/network" end
- hosts設定
ネットワーク設定で設定されたFQDNおよび、ブリッジネットワークIPアドレスを、hostsファイルに追加します。
bash 'hosts' do user 'root' code <<-EOC echo "`ifconfig eth1 | grep 'inet addr'|awk '{print $2}' | sed 's/^addr://'` `hostname` `hostname -s`" | tee -a /etc/hosts EOC not_if "grep -q `hostname` /etc/hosts" end
- Firewall無効化
%w{iptables ip6tables}.each do |s| service s do action [:stop, :disable] end end
- SELinux無効化
bash 'selinux' do user 'root' code <<-EOC cp -p /etc/sysconfig/selinux /etc/sysconfig/selinux.old cat /etc/sysconfig/selinux.old | sed 's/^SELINUX=.*$/SELINUX=disabled/' > /etc/sysconfig/selinux EOC not_if "grep -q 'SELINUX=disabled' /etc/sysconfig/selinux" end
- 起動オプション設定
user 'root' code <<-EOC cp -p /etc/grub.conf /etc/grub.conf.old cat /etc/grub.conf.old | sed 's/quiet.*$/quiet enforcing=0/' > /etc/grub.conf EOC not_if "grep -q enforcing /etc/grub.conf" end
- MACアドレスの自動保存無効化
bash 'ignore mac' do user 'root' code <<-EOC sed -i -e 's|/etc/udev/rules.d/70-persistent-net.rules|/dev/null|g' /lib/udev/write_net_rules EOC only_if "grep -q '70-persistent-net' /lib/udev/write_net_rules" end
- fastestmirror.conf設定
bash 'fastestmirror' do user 'root' code <<-EOC echo "include_only=.jp" | tee -a /etc/yum/pluginconf.d/fastestmirror.conf EOC not_if "grep -q ^'include_only=.jp' /etc/yum/pluginconf.d/fastestmirror.conf" end
- TimeZone設定
bash 'timezone' do user 'root' code <<-EOC cp -p /etc/localtime /etc/localtime.old cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime EOC not_if "strings /etc/localtime | grep -q 'JST'" end
- Locale設定
bash 'locale' do user 'root' code <<-EOC cp -p /etc/sysconfig/i18n /etc/sysconfig/i18n.old cat /etc/sysconfig/i18n.old | sed 's/LANG.*$/LANG="ja_JP.utf8"/' > /etc/sysconfig/i18n EOC not_if "grep -q ja_JP /etc/sysconfig/i18n" end
- レシピの実行
レシピが作成できましたので、Vagrantを用いてプロビジョニングを行います。
最初にプロビジョニングを行う際には、起動中のBoxを停止した後に、provisionオプションを指定してBoxを起動する必要があります。$ vagrant halt $ vagrant up --provision
$ vagrant halt [default] Attempting graceful shutdown of VM... DL is deprecated, please use Fiddle
$ vagrant up --provision Bringing machine 'default' up with 'virtualbox' provider... [default] Clearing any previously set forwarded ports... [default] Fixed port collision for 22 => 2222. Now on port 2200. [default] Clearing any previously set network interfaces... [default] Preparing network interfaces based on configuration... [default] Forwarding ports... [default] -- 22 => 2200 (adapter 1) [default] Booting VM... [default] Waiting for machine to boot. This may take a few minutes... DL is deprecated, please use Fiddle [default] Machine booted and ready! [default] Configuring and enabling network interfaces... [default] Mounting shared folders... [default] -- /vagrant [default] -- /tmp/vagrant-chef-1/chef-solo-1/cookbooks [default] Chef 11.8.2 Omnibus package is already installed. [default] Running provisioner: chef_solo... Generating chef JSON and uploading... Running chef-solo... [2014-01-16T23:40:30-05:00] INFO: Forking chef instance to converge... [2014-01-16T23:40:30-05:00] INFO: *** Chef 11.8.2 *** [2014-01-16T23:40:30-05:00] INFO: Chef-client pid: 2271 [2014-01-16T23:40:31-05:00] INFO: Setting the run_list to ["recipe[base]"] from JSON
[2014-01-16T23:40:31-05:00] INFO: Run List is
] [2014-01-16T23:40:31-05:00] INFO: Run List expands to [base] [2014-01-16T23:40:31-05:00] INFO: Starting Chef Run for localhost [2014-01-16T23:40:31-05:00] INFO: Running start handlers [2014-01-16T23:40:31-05:00] INFO: Start handlers complete. [2014-01-16T23:40:32-05:00] INFO: bash[network] ran successfully [2014-01-16T23:40:32-05:00] INFO: bash[hostname] ran successfully [2014-01-16T23:40:32-05:00] INFO: bash[hosts] ran successfully [2014-01-16T23:40:33-05:00] INFO: bash[selinux] ran successfully [2014-01-16T23:40:34-05:00] INFO: bash[grub] ran successfully [2014-01-16T23:40:34-05:00] INFO: bash[ignore mac] ran successfully [2014-01-16T23:40:34-05:00] INFO: bash[fastestmirror] ran successfully [2014-01-17T13:40:35+09:00] INFO: bash[timezone] ran successfully [2014-01-17T13:40:35+09:00] INFO: bash[locale] ran successfully [2014-01-17T13:40:35+09:00] INFO: Chef Run complete in 3.328295292 seconds [2014-01-17T13:40:35+09:00] INFO: Running report handlers [2014-01-17T13:40:35+09:00] INFO: Report handlers complete [2014-01-16T23:40:30-05:00] INFO: Forking chef instance to converge...今回は、全てのレシピを一度に実行しましたが、レシピの作成の度にプロビジョニングを行うこともできます。最初のプロビジョニングを行った後は、Boxの停止をすること無くプロビジョニングを実行できますので、2回目以降のプロビジョニングでは、以下のコマンドを実行してプロビジョニングを行います。
$ vagrant provision
- 動作確認
プロビジョニング後のBoxに接続し、ホスト名やhostsファイルなどの各設定ファイルが、レシピとおりに変更されているか確認します。
$ vagrant ssh
まとめ
ここまで、Chef環境の構築から仮想マシンの基本設定を行うレシピの実行までを解説しました。
第2回は、LAMP環境を構築するレシピを作成し、プロビジョニングを行う方法を解説します。