なんとなく流れで気がついたら仮想マシンをコマンドラインから生成したり起動したりするツールである vagrant をいじりはじめていた。とりあえず debian 信者である俺は当然のように A list of base boxes for Vagrant から Debian の最新 stable release である wheezy の vanilla base box を拾ってこようとした。
ところがファイルが壊れてるのかなんなのかうまく起動しない。しょうがないので自分で作り始めたのだが日本語のドキュメントがないのでとりあえずメモ的にここに書いておく。
とりあえず vagrant 本体のインストールだが、 gem install vagrant というインストール方法は使えなくなった。古いバージョンしか入らない。今はオフィシャルサイトの ダウンロードページ からインストーラを拾ってくるようになったらしい。
次に VirtualBox をインストールする。新しい vagrant は VMware も使えるようになったらしいのだが、とりあえず従来通り VirtualBox を利用してみることにする。
今回は Debian 7 wheezy の base box を作るので、Debian on CDs から今現在の stable release を拾ってくる。俺がいつも使うのは最小サイズの debian-7.3.0-amd64-netinst.iso というやつ。200M 程度しかないので実はいつも手元においてある。
VirtualBox を起動して、Debian を普通にインストールする*1。ただし vagrant base box 用にユーザー名やパスワードは vagrant v1 用のドキュメントだが Vagrant Documentation - Base Boxes にあるように、
Vagrant Documentation - Documentation - Base Boxes
- Hostname: vagrant-[os-name], e.g. vagrant-debian-lenny
- Domain: vagrantup.com
- Root Password: vagrant
- Main account login: vagrant
- Main account password: vagrant
というようにする。今回は wheezy なので hostname は vagrant-debian-wheezy にした。
今回は vanilla wheezy が欲しいので最小構成でインストールする。インストーラのオプションで出てくる desktop environment とかは全部外した。
そんでもって、一度 root でログインし、
# apt-get install openssh-server sudo
追加で入れるパッケージはこれだけ。
v1 ドキュメントには VirtualBox のツールも入れるように指示されてるけど、なんか普通に wheezy のインストーラが VirtualBox 用のパッケージ入れてくれてるし、別にいいかなって。
sudo のセットアップ
さてここから vagrant 用のセットアップに入る。vagrant は base box を最初に起動するときに、 vagrant という名前のユーザーで sudo mkdir -p /vagrant などしたりする。このときパスワードを自動入力したりしないので、visudo コマンドで
vagrant ALL=(ALL:ALL) NOPASSWD: ALL
という行を付け加えた。もちろん v1 ドキュメントのように
%sudo ALL=(ALL:ALL) ALL
となってる行を
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
と編集し、 vigr で vagrant ユーザーを sudo グループに入れても構わないだろう。
ssh のセットアップ
それから vagrant ユーザーが ssh アクセスできるように、insecure key を配置する。
v1 ドキュメントには github においてある鍵を使えと書いてあるのだが、これだといまの vagrant ではアクセスできないようだ。しょうがないので vagrant をインストールしたホストで
$ ssh-keygen -y -f ~/.vagrant.d/insecure_private_key > ~/tmp/insecure_public_key
という感じで秘密鍵から公開鍵を作り、これをなんらかの方法で VirtualBox で動いてる仮想マシン内の /home/vagrant/.ssh/authorized_keys に配置する。俺は適当なウェブサーバにおいて wget で取得した。
もちろん /home/vagrant/.ssh 以下のオーナーシップを vagrant:vagrant に変更の上、.ssh のパーミッションを 700 に変更しておく。
ついでに v1 ドキュメントにもあるのだが、sshd がアクセス元アドレスを逆引きしようとして接続に時間がかかったりしないように、 /etc/ssh/sshd_config に
UseDNS no
なんて行を追加しておく。
ところで sshd の鍵ペアって同じの使いまわすのなんか気持ち悪いんだけど、base box が最初に起動された時に生成しなおす方法ってないもんですかね? 鍵を削除して dpkg-reconfigure openssh-server すればいいんだろうけど1度だけ自動でやるとかどうするのがスマートかなあ。
vagrant で package する
さてここまでできたらあとは仮想マシンを shutdown して vagrant package する。
事前に apt-get clean しておくことを忘れないように。これでキャッシュされてるパッケージが消える。
気になる人は事前に .bash_history などを削除しておこう。ちなみに bash は終了時にヒストリを書き込むので、root の .bash_history は最小でも rm ~/.bash_hisotry; shutdown -h now などが残ることになる。
仮想マシンを終了したら、以下のようなコマンドで base box を作成する。
$ vagrant package --base path/to/virtualmachine
そうするとカレントディレクトリに package.box という名前で作成される。 ls -lh してみると 455M だった。
こんな感じで作ったものを、以下に置いておいた。
さて実際に動作するかテストしてみよう。
$ vagrant box add wheezy path/to/package.box
とやると手元の vagrant に wheezy という名前の base box が追加される。
適当なディレクトリを掘って、
$ vagrant init wheezy
これで wheezy という名前でおいておいた base box から仮想マシンを作る。カレントディレクトリに Vagrantfile が生成されてるはず。
そしていよいよ……
$ vagrant up
で起動する。うまく起動できただろうか?
どうでもいいけど vagrant up ってなんか響きがロボットアニメの合体とかヒーローの変身の掛け声みたいだよな。ヴァグラントアップ!
うまく起動できたら、
$ vagrant ssh
で接続できるか確認しよう。
$ vagrant ssh-config --host v-d-w >> ~/.ssh/config
というような感じで ssh 設定を書き込むと、
$ ssh v-d-w
だけでアクセスできるようになる。
というわけで
「仮想機兵ヴァグラント、次回もヴァグラントアップ!」