すたらブログ

文系Webプログラマの備忘録

Windows: XAMPPの代わりにVagrantとChef-soloを使う

目次

  1. 環境
  2. Vagrantの導入
    1. VirtualBoxをインストール
    2. Vagrantをインストール
  3. Vagrantで仮想マシンを扱う
    1. 仮想マシンを選ぶ
    2. 仮想マシンを追加する
    3. 仮想マシンを初期化する
    4. 仮想マシンを起動する
  4. Chef-soloの導入
    1. Chef-soloをインストール
    2. Chef-soloの初期設定
  5. saharaの導入
  6. Chef-soloでLAMP環境を整える
  7. つまづいたこと
    1. SSLに関する警告が出る
    2. ファイルの変更がApacheで反映されない
    3. OS起動と同時にApacheが起動してくれない
    4. php、mysqlの最新版を入れたい
    5. phpMyAdminにログインできない
  8. 感想

環境

ホストマシン
仮想マシン
クックブック

Vagrantの導入

この章は以下の記事から多くを引用しています。

VirtualBoxをインストール

普通は下記から最新版をDLすればいいと思います。

ですが、以前の記事に書いたように、現在の最新版である"4.3.14"はバグがあるようなので、下記から古いバージョンをDLします。
私は、安定したものの中では最新版であると思われる"4.3.12"を使っています。

Vagrantをインストール

下記からWindows用のインストーラをDLします。
インストール完了後、OSを再起動します。


Vagrant仮想マシンを扱う

仮想マシンを選ぶ

下記からBoxのURLをコピー、またはBoxそのものをダウンロードします。
私は、余計なものが入っていない(と思われる)"CentOS 6.5 x86_64"を使うことにしました。

下記の更新履歴にも目を通せば安心できると思います。

仮想マシンを追加する

下記のコマンドを実行します。
パスはすでに通っているはずなので、vagrantのコマンドが使えると思います。

コマンドプロンプト
(通常)
vagrant box add centos65-x86_64-20140116 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

(ローカルにダウンロードしたBOXを指定する場合)
vagrant box add centos65-x86_64-20140116 C:\Users\Yuusaku\Downloads\centos65-x86_64-20140116.box

Boxが追加されたことを確認します。

コマンドプロンプト
vagrant box list
centos65-x86_64-20140116 (virtualbox, 0)

仮想マシンを初期化する

任意のフォルダを作成して移動したのち、vagrant init (Box名)を実行します。
(ここでは、"vm1"というフォルダを作成したとします)

コマンドプロンプト
cd vm1
vagrant init centos65-x86_64-20140116

生成された"Vagrantfile"の27行目のコメントアウトを解除します。

vm1/Vagrantfile
# 下の行のコメントアウトを解除する
config.vm.network "private_network", ip: "192.168.33.10"

仮想マシンを起動する

コマンドプロンプト
vagrant up

TeraTermなどを使ってSSH仮想マシンに接続して確認します。

項目
ホスト 192.168.33.10
ポート 22
ユーザー vagrant
パスフレーズ vagrant

仮想マシンが起動していることを確認できました。
この後、仮想マシン上で直接コマンドを実行してサーバ設定をしてもかまいません。
(例: sudo yum -y install httpd)
しかし、せっかくですから"Chef-solo"を使って設定作業を自動化することにします。


Chef-soloの導入

この章は以下の記事から多くを引用しています。

Chef-soloをインストール

下記からWindows用のインストーラをDLします。
(chef-windows-11.12.8-2.windows.msi)
https://www.chef.io/download-chef-client/

Chef-soloの初期設定

パスを追加
  • C:\opscode\chef\bin
  • C:\opscode\chef\embedded\bin
knifeの初期化
コマンドプロンプト
knife configure

選択肢はすべてEnterでかまわないようです。

なお、私の場合、既存のRubyのパスが邪魔をしてエラーになってしまいました。
そこで、いったん環境変数PathからRubyのパスを削除しました。
(C:\Ruby200-x64\bin;)

knife-soloをインストール

gemコマンドを使っていますが、既存のRubyのパスを復活させる必要はありませんでした。

コマンドプロンプト
gem install knife-solo
knife-soloの初期化
コマンドプロンプト
cd vm1 (その仮想マシンのVagrantfileが存在するフォルダ)
knife solo init chef_repo
vagrant-omnibusをインストール
コマンドプロンプト
vagrant plugin install vagrant-omnibus
Vagrantfileに追記する
config.omnibus.chef_version = :latest

saharaの導入

必須ではありませんが、Chefの設定を気軽に試して素早く元に戻せるので、導入をおすすめします。

コマンドプロンプト
(インストール)
vagrant plugin install sahara

(確認)
vagrant plugin list

Chef-soloでLAMP環境を整える

手順

Cookbookのひな形を作成する

本来ならば"httpd"や"mysql"などのサービスごとにクックブックを分けるべきなのかもしれませんが、初めてですし簡単な構成にしたいので、"my_lamp"としてひとつにまとめることにしました。

コマンドプロンプト
cd vm1
knife cookbook create my_lamp -o chef_repo/cookbooks
Vagrantfileに追記する

Chef-soloに関する設定を追記します。

vm1/Vagrantfile
config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = "chef_repo/cookbooks"
  chef.roles_path = "chef_repo/roles"
  chef.data_bags_path = "chef_repo/data_bags"
  chef.run_list = "my_lamp"
end
レシピを書く

ここでは詳しくは書きません。
公開しているレシピをご覧ください。


つまづいたこと

SSLに関する警告が出る

(追記 2015-01-10: Chefのバージョンが11系ではなく12系ならばこの設定は不要です)

プロビジョニングの際、SSL validation of HTTPS requests is disabled.という警告が表示されます。
解決策は下記に書いてありました。

Chefの独自設定ファイルを作り、それをプロビジョニングの際に読みこめばいいようです。

vm1/Vagrantfile.chef
Chef::Config.ssl_verify_mode = :verify_peer
vm1/Vagrantfile
config.vm.provision :chef_solo do |chef|
  chef.custom_config_path = "Vagrantfile.chef" # !!追加!!
  chef.cookbooks_path = "chef_repo/cookbooks"
  chef.roles_path = "chef_repo/roles"
  chef.data_bags_path = "chef_repo/data_bags"
  chef.run_list = "my_lamp"
end

ファイルの変更がApacheで反映されない

ApacheのドキュメントルートをVagrantの共有フォルダ内に指定している場合。
ファイルをホスト側で更新しても、仮想マシン側のApacheでは反映されません。 下記のページに解決策が書いてありました m(_ _)m

私の環境では、EnableMMAP offEnableSendfile offは、ドキュメントルートに指定したフォルダではなく全体に設定しないとダメでした。
具体的には、下記の行のコメントアウトを解除することで解決しました。

cookbooks/my_lamp/templates/default/httpd.conf.erb
# 466行目
EnableMMAP off

# 475行目
EnableSendfile off

OS起動と同時にApacheが起動してくれない

ApacheのドキュメントルートをVagrantの共有フォルダ内に指定している場合。
仮想マシンの起動と同時にApacheが起動してくれません。
下記のページに解決策が書いてありました m(_ _)m

"httpd.conf"を作成し、適切な場所に配置するようにレシピを書きます。

cookbooks/my_lamp/files/default/httpd.conf
start on vagrant-mounted
stop on stopping network-services

exec /sbin/service httpd start
cookbooks/my_lamp/recipes/default.rb
cookbook_file '/etc/init/httpd.conf' do
  source 'httpd.conf'
  mode 0644
end

phpmysqlの最新版を入れたい

CentOSの初期状態のyumリポジトリでは古いバージョンのままです。
最新版を入手できるリポジトリを追加します。

リポジトリの名前が分からなかったので、一旦手動で追加して名前を確かめました。

仮想マシンの端末
sudo rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo ls -l /etc/yum.repos.d/
初期状態のリポジトリ一覧
-rw-r--r--.  1 root root 1926 Dec  1  2013 CentOS-Base.repo
-rw-r--r--.  1 root root  638 Dec  1  2013 CentOS-Debuginfo.repo
-rw-r--r--.  1 root root  630 Dec  1  2013 CentOS-Media.repo
-rw-r--r--.  1 root root 4528 Dec  1  2013 CentOS-Vault.repo
-rw-r--r--.  1 root root  957 Nov  5  2012 epel.repo
-rw-r--r--.  1 root root 1056 Nov  5  2012 epel-testing.repo
追加されたリポジトリ
-rw-r--r--   1 root root 1209 Dec  2  2013 mysql-community.repo
-rw-r--r--   1 root root 1060 Dec  2  2013 mysql-community-source.repo
-rw-r--r--   1 root root 2298 Mar  1 10:47 remi.repo

リポジトリの名前が分かったので、creates属性を指定できるようになりました。

cookbooks/my_lamp/files/default/httpd.conf
# レポジトリを追加 (PHP用)
bash 'add_repo_remi' do
  user 'root'
  code <<-EOC
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
  EOC
  creates 'remi.repo'
end

# レポジトリを追加 (MySQL用)
bash 'add_repo_mysql' do
  user 'root'
  code <<-EOC
    rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
  EOC
  creates 'mysql-community.repo'
end

phpMyAdminにログインできない

Chefとは関係ない問題ですが。

MySQLのユーザ情報は下記の通り。
MySQLのインストール時から何も手を加えていません。

項目
ユーザ root
パスワード (なし)

ログインできない理由は、$cfg['Servers'][$i]['AllowNoPassword'] = FALSE;となっているせいでした。
ログイン方法と一緒に、下記のように修正しました。
セキュリティが甘くなりますが、ローカル開発環境用なので問題ありません。

/etc/phpMyAdmin/config.inc.php
<?php
// (抜粋)
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE; 
?>

感想

ひとつ進んでは止まり、の繰り返しでうんざりしてしまい、もう諦めてXAMPPを使い続けようかと思いましたが、ようやく実用水準に達することができたと思います。
PHPでのYAMLの使用など、XAMPPに手を加えて実現していた環境を再現できていませんが、とりあえず"LAMP"の体裁は整っているので、ここで区切りをつけてブログに書くことにしました。

下記の伊藤直也さんの本がとても参考になりました。
OSが違うので直接流用できない記述も多いですが、Chefの意義や基本的なしくみがとてもよく分かりました m( )m


関連記事