ChefでプロビジョニングしたVagrant BoxをVagrantCloudでホストするまで。
開発環境
- MacOS X
- Virtualbox 4.3.12 r93733
- Vagrant 1.6.5
- ChefDK 0.3.0
Vagrant up!
今回は、Base boxを作るのではなく、既存のBoxを元に構成したVMを別のBoxとしてアーカイブする事が目的のため、先ずはVagrant upします。
ベースとするBoxは、chef/centos-6.5をvagrantcloudから持ってきます。
$ vagrant init chef/centos-6.5
$ vagrant up
LAMP環境を構成
VagrantにLAMPを構成する方法はググると腐るほど出てくる。(ありがたや)
とりあえず、適当に作ってみる。
Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Base Box
config.vm.box = "chef/centos-6.5"
# Configure plugins for provisioning
config.omnibus.chef_version = :latest
config.berkshelf.enabled = true
# Configure Network
config.vm.network :private_network, ip: "192.168.33.10"
# Configure VirtualBox
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
vb.customize ["modifyvm", :id, "--cpus", "1"]
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
end
# Enable provisioning with chef solo
config.vm.provision "chef_solo" do |chef|
chef.add_recipe "mysql::client"
chef.add_recipe "mysql::server"
chef.add_recipe "php"
chef.add_recipe "php::module_mysql"
chef.add_recipe "php::module_gd"
chef.add_recipe "httpd"
chef.json = {
:mysql => {
server_root_password: "rootpass",
server_repl_password: "rootpass",
server_debian_password: "rootpass",
bind_address: "127.0.0.1"
},
:php => {
:packages => ["php",
"php-devel",
"php-cli",
"php-pear",
"php-mbstring",
"php-pdo",
"php-xml"]
}
}
end
end
Berksfile
source "https://supermarket.getchef.com"
cookbook 'php', '~> 1.5.0'
cookbook 'mysql', '~> 5.5.3'
# custom cookbooks
cookbook "httpd", path: "site-cookbooks/httpd"
(httpdだけちょうどいいのがパッと見つからなかったので、自作。もろもろGithubにおいてある)
あとは、vagrant reload && vagrant provision
で構成する。
vagrant packageでパッケージ(box)を作成
$ vagrant exec sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
$ vagrant package -o centos65-php53-lamp.box
を実行すると、centos65-php53-lamp.box が作成されます。
vagrant package
を実行する前に、sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
を実行しないと作成されたBoxを使用した際にエラーが発生します…。。
(パッケージ作成する前にゲストOS側のMacアドレスの設定?を無効にしないといけないらしい。。)
(参考)Device eth1 does not seem to be present, delaying initialization. エラー - purazumakoiの[はてなブログ]
作成されたcentos65-php53-lamp.box をbox
に追加し実際に動かしてみます。
$ vagrant box add package ./centos65-php53-lamp.box
$ mkdir /tmp/test-package && cd $_
$ vagrant init package
$ vagrant up
正常に起動し、ちゃんとLAMP環境になっているもよう。
Vagrant cloud にのせてみる
やっと本題w!! (スクショ取り忘れた…。簡単だったからいいか。)
1. Boxを追加する
- Vagrant cloudへログインし、右上の
create box
から作成します。 - Boxのタイトル、検索用の短い説明、詳細説明、など必要項目を入力します。
完了すると、次のステップに進みます。
2. Boxにバージョンを追加する
- バージョン番号と、そのバージョンの変更内容を入力します。
次へ!
3. Providerを追加する
- Vituralbox などのプロバイダーの選択
- Boxファイルのアップロード or URLの入力
Boxファイルもホストしてくれるのかと思っていたのですが、Vagrantcloud上でホスティングするには有料ユーザーへアップグレードが必要なようです。。 S3を使おうかとも思ったのですが、無駄なお金を払い続けるのにためらい…Githubに甘えました。
Githubのリリース機能を使うと、大きいファイルも一応ホストしてくるみたいです。ただ、「配慮してくれよ!」との事なので…(詳細はGithub Helpを)
4. Publishする!
設定が完了すれば、あとは公開ボタン押下ですぐに公開されます。
作ったのはこれ。 https://vagrantcloud.com/senta/boxes/centos65-php53-lamp
ここまで簡単にできちゃうのが本当にすごい!!
Vagrant Cloudから作成したBoxを使う
vagrant init senta/centos65-php53-lamp
で無事Boxが取り込まれ、Vagrant upできればOK!
Vagrantとっても便利だけど、公開されているBoxを使うのは躊躇いがある時、bento + Berkshelfであっさり環境を作成でき、更にそれをローカル環境から出して管理できる。
便利だ。
vagrantcloudの有料機能とか、お金の事も考えているMitchell Hashimoto さんマジリスペクト。