Windows: XAMPPの代わりにVagrantとChef-soloを使う
目次
環境
ホストマシン
- Windows 7 64bit
- VirtualBox: 4.3.12
- Vagrant 1.6.3
- Chef-solo 11.12.8-2
仮想マシン
クックブック
Vagrantの導入
この章は以下の記事から多くを引用しています。
VirtualBoxをインストール
普通は下記から最新版をDLすればいいと思います。
ですが、以前の記事に書いたように、現在の最新版である"4.3.14"はバグがあるようなので、下記から古いバージョンをDLします。
私は、安定したものの中では最新版であると思われる"4.3.12"を使っています。
- 入手先: Download_Old_Builds_4_3 – Oracle VM VirtualBox
- 参照:(未解決) Windows7でVirtualBox4.3.14が起動に失敗する - すたらブログ
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 off
とEnableSendfile 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
php、mysqlの最新版を入れたい
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