Program LOG

勉強した内容をまとめ中。。。間違ってたら教えて。。。

Windows&Vagrantで自動仮想環境構築 - provisioning+自作BOX

前回の記事までで、Vagrantを使って仮想マシンを作成し、WEB開発環境を整えるところまでは行いました。
今回は、provisioningのテストと作成した仮想マシンのBOXを作成してみたので、書いていきたいと思います。

前回までの記事はこちら
Windows&Vagrantで自動仮想環境構築 - Program LOG
Windows&Vagrantで自動仮想環境構築 - ネットワーク設定とWEBサーバー導入編 - Program LOG

provisioning(プロビジョニング)って何だ?

私たちは、SSH接続し、webサーバをインストールしている途中かもしれません。 しかし、Vagrantを使用するすべてのひとは、同じことをすべきです。 Vagrantは自動プロビジョニングのサポートが組込まれています。 この機能を使うことで、vagrant upした際に、Vagrantは自動的にソフトウェアをインストールします。 そのため、ゲストマシンは同じように生成され、使用準備を整えることができます。

provisioningを設定すると、起動した時に指定しておいたことを自動的に実行してくれるって事ですね。
これは、複数人で開発するときに便利ですね。。。
今までは、毎回仮想マシンを用意してましたもんね。。。

基本的な記述方法

provisioningはshellファイルを起動時に読み込んで実行する事が出来るようです。
まずテスト的に以下のようなshファイルを作成してみました。

provision.sh

echo provisioning test

次に、vagrantfileに実行パスを設定したいと思います。
これは何行目でも大丈夫っぽいですが、今回は「end」の直前に指定してみました。

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 ・・・中略
  config.vm.provision :shell, :path => "provision.sh"
end

これで以下のように実行すると、provisionが実行されます。

$ vagrant provision
==> default: Running provisioner: shell...
    default: Running: ....
provisioning test

もちろんhaltしてからupを実行しても実行されるはずです。

$ vagrant halt
==> default: Attempting graceful shutdown of VM...

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'dev1'...
==> default: Matching MAC address for NAT networking...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version f
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.16
    default: VirtualBox Version: 4.3
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => ...
==> default: Running provisioner: shell...
    default: Running: ...
provisioning test

うん。まぁ出ますよねw
しかし、ちょっと気になっているのが、「Warning: Connection timeout. Retrying.」が毎回出て、
しかもそいつのところで起動が毎回遅いという。。。ん~。。。ちょっと調べてみたら、
同じような事を書いている記事を発見!ナイスです。
vagrant up で Error: Connection timeout. Retrying... - 理系学生日記
なるほど~。。。起動しているのに、何度もsshで接続しようとして失敗し続けているって事ですね。
感謝!

さて、本題に戻ります。
provisionファイルを指定しておくと、起動時にshellを実行してくれます。
例えば、phpのバージョンは・・・とか、postgresはを入れて・・・とか
そうゆうのはprovisioningを設定しておけば、簡単に行えるって事ですね。
まぁ。。。shellもそんなに書いた事が無いので、んーって感じですが、
初回起動時にだけ、ファイルを読み込むってのもいいかも知れませんね。

本当は、この段階でchef-soloでやるって選択肢の方がいいですね。
ただ、ちょっとしたルーティンなんかは、provisioningでやるのもありかもしれません。

boxを自作して使いまわす。

webサーバーやphp+mysqlなど、基本的な構成は開発する上で変わらないと思います。
自分なりにカスタマイズした仮想マシンをBOX化する事で、簡単に仮想マシンのコピーが出来ます。
それでは、今回は今まで作ってきた仮想マシンをBox化して、それを使って新しい仮想マシン
作成したいと思います。

まずはboxを作成したいと思います。

$ vagrant package
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: ...
$ ls
Vagrantfile  index.html  package.box  provision.sh

仮想マシンが立ち上がっている場合には、自動的にシャットダウンされます。
※かなり時間がかかりました。。。。

次に、以下のコマンドで、Boxを追加したいと思います。

$ vagrant box add apachebox package.box
==> box: Adding box 'apachebox' (v0) for provider:
    box: Downloading: ...

==> box: Successfully added box 'apachebox' (v0) for 'virtualbox'!

※追加したら、もうpackage.boxファイルは不要なので、削除してしまっても大丈夫です。

せっかく作成したので、作成したBoxを使って仮想マシンを作成し、起動してみたいと思います。

$ cd ../
$ cd ./dev2
$ vagrant init apachebox
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.
$ vagrant up

同時に起動したい場合には、ネットワークの設定などを指定してあげる必要があるとは思いますが、
今回はそのまま起動しました。
正常にコピー出来ているか、WEBサーバーがあるかを確認してみようと思います。

$ vagrant ssh
Last login: Sun Apr 13 07:03:13 2014 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost /]$ sudo service httpd status
httpd (pid  1434) is running...

初回起動で、既にapacheがインストールされており、起動も確認できました。

今後は、このboxファイルを使用して、様々な開発環境へ対応できるようになっていけると思います。

今後やりたい事。

  • 開発環境と本番環境をあわせる為、chefを使用した環境作り
  • vagrantプラグインで便利なのが多数あるらしいので、調査
  • Webサーバー以外に色んなミドルウェアを追加していく。