home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/運用管理/Vagrant

技術/運用管理/Vagrant

技術 / 運用管理 / Vagrant
id: 1284 所有者: msakamoto-sf    作成日: 2014-05-06 12:12:13
カテゴリ: DevOps Ubuntu Vagrant VirtualBox 

開発用VMのパッケージングとデプロイを簡略化してくれるVagrantのメモです。

紹介記事:



勉強メモ

  • vagrantコマンドは、引数にVMの名前やIDなど全く指定せずに実行できるが、どうやって区別してるのか?
    • "vagrant init"したディレクトリに、".vagrant"というディレクトリが作成され、その中でProvider用のIDが入ってるっぽい?
    • なので、単純にカレントディレクトリのVagrantfileや".vagrant"ディレクトリ辺りを参照して区別してると想像。
  • "vagrant ssh" は内部的にはsshクライアントを実行するので、Windowsの場合はCygwinなりMinGWなりでsshクライアント(ssh.exeなど)を導入しておきPATH通しておく必要がある。
    • "vagrant ssh-config" で確認すると、そのVagrant用のSSH接続設定が、ssh_config形式で確認できる。
  • "vagrant provision" すると、内部的にはsudoしてroot権限でshellを実行してる。
  • "config.vm.provision" は、書けば書いた分だけ上から順繰りに実行してく。
  • "vagrant up" した後で、SSHログイン中から手動でshutdownしたり、そのあとVirtualBoxマネージャから手動でUPしたり、手動でVMの設定変更したりして、その後 vagrant up したらどうなるか?
    • 基本的には、手動で変更した設定はそのまま維持される。手動でVMをshutdownしたのを vagrant up でUPできるし、手動でUPしたVMを vagrant halt で落とすことも出来る。(vagrant側でVMのUP/DOWN状態を管理してて、手動操作するとズレてしまって以降、エラーとなってしまう・・・ようなことは、無い。)
    • ただし、Vagrantfileでprovider=virtualboxで独自の設定(VBoxManageのオプション設定)を行っている場合は、vagrant up するときにVagrantfile中のVBoxManageのオプション設定が適用されてしまう。(VBoxMangeオプションをカスタマイズしていない項目についてはそのまんま。)
      • 例:Vagrantfileでmemoryサイズだけを指定してる場合・・・
      • memoryとは関係しない設定を手動で変更:vagrant up しても、それはVagrantfileで指定されてないのでそのまま。
      • memoryサイズを手動で変更:vagrant up すると、Vagrantfile中で指定されているのでそちらで上書きされてしまう。
    • VM名を手動で変更しても、Vagrantfileで指定されていれば戻されてしまう。
      • VM名を好き勝手変更しても、内部のIDかなにかでひも付けされているらしく、vagrantコマンドで正常に区別出来る。特に指定しなければ、VagrantfileではVM名までは指定せず、作成した後に個別の開発者ごとに好き勝手に変えてもらうのでも良いのだろう。
  • VirtualBoxを使う場合、Vagrantfile中でVM設定をカスタマイズするためのパラメータは、基本的にVBoxManageのmodifyvmコマンドのオプション指定と同じ。

例:

  config.vm.provider "virtualbox" do |vb|
    vb.name = "t3_precise64_demo"
    # Don't boot with headless mode
    vb.gui = true
    # Use VBoxManage to customize the VM. For example to change memory:
    vb.customize [
        "modifyvm", :id,
        "--memory", "2048",
        "--vram", "64",
        "--cpus", "2",
        "--audio", "none",
        "--clipboard", "bidirectional",
        "--usb", "off",
        "--usbehci", "off",
        "--nic1", "nat",
        "--nictype1", "82540EM",
        "--cableconnected1", "on",
        "--nic2", "hostonly",
        "--nictype2", "82540EM",
        "--cableconnected2", "on",
        "--hostonlyadapter2", "VirtualBox Host-Only Ethernet Adapter",
    ]
  end
  • 2つ以上のVMを同時に"vagrant up"すると、SSHのポートフォワードはどうなるか?
    • VirtualBoxを例に実験してみたところ、1番めにvagrant upしたのはホストの2222が22番にフォワードされ、2番めにvagrant upしたのは、ホストの2200が22番にフォワードされた。
    • 結果として、ポートフォワードが衝突することは無く、"vagrant ssh" でもそれぞれの環境に正常に接続できた。

VirtualBox上での実験例, 一個目のvagrant up:→ 127.0.0.1:2222 が 22にフォワードされた。

t9> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu-1204-lts-t1'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: ubuntu1204lts-test2
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    ...

VirtualBox上での実験例, 二個目のvagrant up:→ 127.0.0.1:2200 が 22にフォワードされた。

t8> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2200 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    ...
  • 同じboxで"vagrant init"して、特にprovider用の名前などカスタマイズも行っていない状態で、2つのVMを"vagrant up"するとどうなるか?
    • VirtualBoxを例に実験してみたところ、"vagrant init"したディレクトリ名 + ランダムな数値(unixタイムっぽいが)がVMの名前に自動設定されたため、衝突しなかった。
    • →こんな感じに、VM名が衝突してない。

VirtualBoxでのネットワーク設定メモ:

plugin

参考:

以下、実際に試してみたもの。
(試したホスト環境:Win7 Pro 64bit 日本語版 + VirtualBox 4.3.12 + Vagrant 1.6.3)

sahara

インストール:

> vagrant plugin install sahara

"vagrant up"したディレクトリにCDして、制御。

> vagrant sandbox on
→ sandbox専用のsnapshotが作成される。

> vagrant sandbox rollback
→ ロールバックされる。snapshotからのVM再起動になる。

> vagrant sandbox commit
→ commitされる。特にVM再起動は起こらない。

> vagrant sandbox off
→ sandbox専用のsnapshotが削除され、sandboxモードが終了する。
※snapshotが削除されるため、事実上、暗黙的にcommitされた形になる。

> vagrant sandbox status
→ 今sandbox中かどうか確認。

なお、上記コマンドはすべて、仮想マシンがON中に操作できる。
仮想マシンOFF中でも"vagrant sandbox on"はできたが、意味があるかどうかは不明。
"vagrant sandbox rollback"で再起動が発生する点に注意。

参考:

  • "vagrant sandbox on" する前 or "vagrant sandbox off" した後
  • "vagrant sandbox on" した後 → sandbox専用のsnapshotが作成されている。

vagrant-vbox-snapshot

インストール:

> vagrant plugin install vagrant-vbox-snapshot

"vagrant up"したディレクトリにCDして、制御。
VirtualBoxのスナップショットを制御するプラグイン。VirtualBoxのGUIマネージャからスナップショットを制御するのと同等。

vagrant-global-status

→ Vagrant 1.6になり、本体に統合された:

> vagrant global-status
id       name    provider   state   directory
------------------------------------------------------------------------
2e8feba  default virtualbox running c:/work/tmp/vagrant_ex/t8
f310a6e  default virtualbox running c:/work/tmp/vagrant_ex/t9

The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date. To interact with any of the machines, you can go to
that directory and run Vagrant, or you can use the ID directly
with Vagrant commands from any directory. For example:
"vagrant destroy 1a2b3c4d"

boxの作成

Ubuntu 12.04 LTS 64bit版 (2014-05時点では既に 14系列でLTSが始まってて今更ではありますが・・・) でboxを作成してみたのでメモ。
2014-05に試した環境:

Host: Win7SP1 64bit 日本語版
VirtualBox: 4.3.10
Vagrant: 1.5.4

参考資料

Vagrant公式:

これのChapter 7 が、Ubuntu 13でのVirtualBoxでのbox作成手順の解説になってます。

これらの参考資料からつぎはぎして、ポイントだけ抜書きするとこんな流れになりました。

"Box"ファイルはOVFやOVAとどう違うのか?

初期のVagrantはVirtualBoxのマシンをexportしたのをtarにまとめてただけだったようですが、複数のproviderをサポートするようになり、OVAに近い形で、providerごとのVMイメージ+Vagrantが使うmetadata.jsonをtarで固めたファイルになったようです。OVA, OVFと同一ではありませんが、それと似た構成にはなってるそうです。

OVF, OVAとは

1. VMの作成

"Creating Development Environments With Vagrant"版を見ながら作成:

  • VM名は "vagrant-ubuntu-raring" にしておく。
  • 360MBのメモリが推奨っぽいこと書かれてたので、360MBで作成。
    • 最新のVagrantのドキュメントでもこれが推奨なのかは未確認。
  • 同書籍ではHDDとして40GBと書かれてるが、面倒くさいしそこまでデフォルトインストールじゃ使わないしお試しなので、8GBに。なお、サイズ可変としておいて、最初から8GBのサイズでは作らない。
  • Ubuntu 12.04 LTSをインストール。サーバ用のiso使ったので、GUIは入らない。
  • ユーザを追加するときに、ユーザ名 vagrant, パスワード vagrant で追加。これは、Vagranのドキュメントでも指定されてる。
  • OpenSSH サービスだけ有効化してインストール。
Box作成時のポイント:ディスクファイルタイプは"VMDK"一択

初期のVagrantであればVirtualBoxのみを考えれば良かったので"VDI"でも良かったようだが、最近になって複数のProviderをサポートするようになり、互換性のある"VMDK"の選択が推奨されるようだ。


Vagrantのbox作成ドキュメントでは"VMDK"で「なければならない」と明記されてる箇所は見つけられなかった。こちらに、Boxファイルのアーカイブ内容の説明に".vmdk"とある:
https://docs.vagrantup.com/v2/virtualbox/boxes.html

2. FirewallとSELinuxの無効化

今回のUbuntu 12.04 LTSだと、デフォルトはSELinuxはインストールされず、Firewall(ufw)もinactiveになってるので、特に設定変更は必要ない。

CentOSだと・・・

  • "service iptables stop", "chkconfig iptables off" でFirewall停止&自動起動OFF
  • "setenforce 0", "/etc/sysconfig/selinux" 編集してSELINUXTYPE=disabled、さらに "/etc/grub.conf" 編集して"enforcing=0"をkernelパラメータに追加でSELinuxを無効化。

3. rootユーザのパスワードを "vagrant" に変更

実際はこれを使うことは無いけど、Vagrantのboxを作るときのお作法らしい。Vagrantの公式ドキュメントにも載ってる。多分こうしておけば、どんなbox使っても、rootになる時に困らないよね、という意図か。

$ sudo su -
# passwd
("vagrant"に設定)

4. MACアドレス変更によりNICデバイスがずれる現象を補正

vagrant initとかでVM設定のMACアドレスが変化する場合がある。最近のLinuxだと"/etc/udev/rules.d/70-persistent-net.rules" というファイルにどのMACアドレスがどのethNか、というのが自動保存されて永続化されてしまうため、MACアドレスが変わるたびにethNが増えていってしまい、設定作業の手間が増えてしまう。

そこで、以下のように "70-persistent-net.rules" を "/dev/null" のシンボリックリンクとして、自動保存しようとしても保存されず、読み出すことも出来ないようにしておく。

$ cd /etc/udev/rules.d/
$ sudo mv 70-persistent-net.rules .70-persistent-net.rules
$ sudo ln -s /dev/null 70-persistent-net.rules

5. パスワード無しでsudoできるように調整

・"admin"グループを新規作成して、"vagrant"ユーザを追加する。(Vagrant公式のprecise64等でのお作法。ただし、最終的にvagrantユーザがパスワード無しでsudo出来るようになっていれば良いので、必ずしもこのグループ設定を行う必要はない。つまり、Vagrantは"admin"グループに依存していない)

$ sudo groupadd admin
$ sudo usermod -a -G admin vagrant

・sudoersファイルを調整。

$ sudo visudo

調整ポイント1:

Defaults env_keep+="SSH_AUTH_SOCK"

ファイルの先頭くらいに追加するらしい。SSHポートフォワーディング等をsudo越しに使った時に、SSHエージェント側で接続済みのコネクションを使えるよう、環境変数を引き継げるよう設定。("Creating Development Environments With Vagrant"で指示されてる設定。Vagrant公式ドキュメントや他の参考資料では、特にこの設定は指定されていない)

調整ポイント2:(全参考資料共通)

%admin ALL=(ALL) NOPASSWD: ALL
  • ファイル末尾に置くなどして、必ずこれが使われるようにしておく。
  • 再起動後にログインしなおして、本当にパスワード無しでsudoできることをテストしておく。
  • 今回は"admin"グループを追加してるのでこういう書き方にしてるだけ。以下のように"vagrant"ユーザをピンポイントでNOPASSWD設定しても良い。最終的にvagrantユーザでパスワード無しでsudoできれば良い。
vagrant ALL=NOPASSWD:ALL

調整ポイント3:(全参考資料共通)

Default requiretty

→入っていれば、コメントアウトしておく。もし無ければ、デフォルトoffなので特に弄る必要はない。

6. Vagrant共通の、"vagrant ssh"用の公開鍵を追加

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

7. SSH接続した時にsshd側でのDNSの逆引きを無効化

sudo vi /etc/ssh/sshd_config

→以下の行を設定。(デフォルトはYESなので、もし設定がなければ明示的に追記する必要あり。)

UseDNS no

参考:

8. VirtualBox Guest Additionsの導入

"Creating Development Environments With Vagrant"版:

$ sudo apt-get update
$ sudo apt-get install linux-headers-$(uname -r) build-essential

Vagrantの公式ドキュメントから:

$ sudo apt-get install linux-headers-generic build-essential dkms

最終的に、kernelのヘッダファイルと、build-essential, dkms が入れば良いのだろう。

以降のビルド操作はVagrant公式ドキュメントの通り。

$ sudo mount /dev/cdrom /media/cdrom
$ sudo sh /media/cdrom/VBoxLinuxAdditions.run

9. キャッシュファイルなどを削除

"Creating Development Environments With Vagrant"版:

$ rm -rf /tmp/*
$ sudo apt-get clean

他にも、boxファイルサイズ削減のため未使用領域をゼロ埋めしたり、manページのキャッシュを削除するなど色々工夫があるらしい。

$ sudo dd if=/dev/zero of=/EMPTY bs=1M
$ sudo rm -f /EMPTY

10. パッケージングと動作確認

vagrant package --base VM名
->
vagrant package --base vagrant-ubuntu-raring
==> vagrant-ubuntu-raring: Exporting VM...
 ==> vagrant-ubuntu-raring: Compressing package to: c:/work/tmp/vagrant_ex/box/package.box

package.boxのファイルサイズは460MBほどになった。8GBの可変サイズでDisk作ったのでこんなもんかな?

"vagrant box add" してみる。

> cd c:\work\tmp\vagrant_ex\box
> vagrant box add ubuntu-1204-lts-t1 package.box
==> box: Adding box 'ubuntu-1204-lts-t1' (v0) for provider:
    box: Downloading: file://c:/work/tmp/vagrant_ex/box/package.box
    box: Progress: 100% (Rate: 72.4M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'ubuntu-1204-lts-t1' (v0) for 'virtualbox'!

> vagrant box list -i
hashicorp/precise32 (virtualbox, 1.0.0)
hashicorp/precise64 (virtualbox, 1.1.0)
ubuntu-1204-lts-t1  (virtualbox, 0)

> cd c:\work\tmp\vagrant_ex
> mkdir box_test
> cd box_test
> vagrant init ubuntu-1204-lts-t1
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
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu-1204-lts-t1'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: box_test_default_1399303793682_85095
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> 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: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => C:/work/tmp/vagrant_ex/box_test
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` /vagrant /vagrant

最後に"Synced Folders"の "/vagrant" のmountでエラーが発生してはいるが、この時点で "vagrant ssh" でログイン出来るようになっていた。

11. "/vagrant" mountエラー と VirtualBox 4.3.10 での対処

"/vagrant" のmountエラーは、box作成時にインストールしたGuest Additionsのバージョンと、実際に動かすVirtualBoxのバージョンとでズレがあったりすると、発生する場合があるらしい。
一般的な対策としては以下のパターンが見つかった:

  • VM中のGuest Additionsを最新のバージョンに更新する。
    • VirtualBoxの方から最新版を入れなおしたり、
    • ディストリビューションによってはパッケージで提供されてたりするのでそちらを使ってみたり、
    • "vagrant-vbguest" というvagrant プラグインを入れて自動更新されるようにしたりする。
  • Guest Additionsを最新にしたら、 "sudo /etc/init.d/vboxadd setup" してモジュールをビルド・インストールし直す。

参考:

2014-05時点:VirtualBox 4.3.10 では、以下のissueの対策例に従う

vagrant sshでログイン後:

$ sudo /etc/init.d/vboxadd setup
$ sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions

12. Windowsホストで1.5系をインストールした状態で1.6系を上書きインストールすると"package"コマンドが失敗するようになる

Windowsホストで1.5系をインストールした状態で1.6系を上書きインストールしてみたら、"package"コマンドで"bsdtar"コマンドが見つからず、失敗するようになった。
参考:

一旦Vagrantをアンインストールしてクリーンな状態にしてから、1.6系をインストールすれば問題は解消されたので、今後のアップデート時も注意する必要がありそう。



プレーンテキスト形式でダウンロード
現在のバージョン : 7
更新者: msakamoto-sf
更新日: 2017-01-07 22:11:43
md5:780ad7a070e3270f95896163375c4812
sha1:6aad0cefb4519d57d1034cc11175f7043df4a567
コメント
コメントを投稿するにはログインして下さい。