Chefを用いたLAMP開発環境の構築方法~仮想環境構築編

chef-solo

はじめに

以前の記事 LAMP開発環境の構築方法~仮想環境構築編および、 LAMP開発環境の構築方法~LAMP環境構築編では、仮想環境の構築から、LAMP環境構築の方法について、2回に渡って解説しました。
今回は、サーバー構成管理ツールであるChefを用いたLAMP環境の構築方法について、2回に分けて解説します。 第1回は、Chef環境の構築から仮想マシンの基本設定を行うレシピの実行までを解説します。

Chef環境の構築

  1. Chefのインストール

    初めてChefをインストールする方は、Cygwin + rbenv環境でプロビジョニングサーバーを構築する方法(第2回)~仮想化ソフトウエアを導入し、Chef環境を構築するを参考にして、rbenv環境および、Chefのインストールして下さい。

    既に、rubyの実行環境をお持ちの方で、初めてChefをインストールする方はgemパッケージからChefをインストールして下さい。

    $ gem i chef --no-ri --no-rdoc
    
  2. 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
    
  3. Vagrantプラグインのインストール

    ChefがインストールされていないBoxに、Chefを自動的にインストールするvagrant-omnibusプラグインをインストールします。

    $ vagrant plugin install vagrant-omnibus
    
    5002-03

仮想マシンの起動

Chefプロビジョニングを行うBoxを作成し、起動します。

  1. 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
    
    5002-05
  2. 編集が終了したら、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にレシピを追加した後、プロビジョニングを実行します。

  1. レシピの指定

    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
    
    5002-07
  2. 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
    
  3. ネットワーク設定

    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
    
    5002-09
  4. ホスト名設定

    ネットワーク設定で設定された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
    
    5002-10
  5. 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
    
    5002-11
  6. Firewall無効化
    %w{iptables ip6tables}.each do |s|
      service s do
        action [:stop, :disable]
      end
    end
    
    5002-12
  7. 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
    
    5002-13
  8. 起動オプション設定
      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
    
    5002-14
  9. 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
    
    5002-15
  10. 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
    
    5002-16
  11. 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
    
    5002-17
  12. 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
    
    5002-18
  13. レシピの実行

    レシピが作成できましたので、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
    
  14. 動作確認

    プロビジョニング後のBoxに接続し、ホスト名やhostsファイルなどの各設定ファイルが、レシピとおりに変更されているか確認します。

    $ vagrant ssh
    
    5002-22

まとめ

ここまで、Chef環境の構築から仮想マシンの基本設定を行うレシピの実行までを解説しました。
第2回は、LAMP環境を構築するレシピを作成し、プロビジョニングを行う方法を解説します。

Comments are closed.