Vagrant BoxをプロビジョニングしてVagrantCloudで公開する

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 さんマジリスペクト。

SHOTA

I'm WEB developer

Tokyo, Japan http://senta.me/