Packer はJSONで記述した構成ファイルに従って $ packer build
コマンド一発でVMイメージを作成でき、さらにVagrant BoxやAmazon EC2のイメージにエクスポートできる超クールなツールです。ちなみに開発者はVagrantの開発者で有名なMitchell Hashimoto氏です。
今回はPackerでVagrant Boxの作成の自動化をしようとした際にハマったポイントとその解決方法について報告します。
トラブルその1: SSHに接続できずタイムアウトする
packer build
の実行中に
==> virtualbox: Waiting for SSH to become available...
と表示されたままタイムアウトしてビルド失敗になる場合や、vagrant up
実行中に
[default] Booting VM... [default] Waiting for VM to boot. This can take a few minutes.
と表示されたままタイムアウトになる場合です。
VirtualBox のポートフォワーディングが効いているかどうかを確認する
ポートフォワーディングが有効になっていないとPackerやVagrantはゲストOSのSSHサーバに接続することができません。ファイアウォール等でブロックしている可能性もあります。
SSHクライアントで手動でゲストOSにアクセスできるかどうか調査すると解決の糸口が見えるかもれません。
トラブルその2: vagrant up 時にSSHの認証に失敗する
以下のようなメッセージが出てしまう場合です。
SSH authentication failed! This is typically caused by the public/private keypair for the SSH user not being properly set on the guest VM. Please verify that the guest VM is setup with the proper public key, and that the private key path for Vagrant is setup properly as well.
1. /home/vagrant/.ssh/authorized_keys を確認する
Vagrantが使う公開鍵が authorized_keys
に登録されていないとSSHで認証エラーになります。登録されていない場合は https://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub を authorized_keys
に追加してください。
$ curl https://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub >> /home/vagrant/.ssh/authorized_keys
2. PubkeyAuthentication が有効かを確認する
sshdの設定で PubkeyAuthentication
が有効になっていないと Vagrant は公開鍵認証ができずに失敗します。/etc/ssh/sshd_config
の設定を確認してみてください。
3. sudoers を正しく設定する
Vagrantのは非tty環境からsudoを叩きますが、sudoersの設定でこれが禁止されている場合があります。その場合は以下のようにしてユーザ vagrant
の requiretty
オプションを無効化しておきます。
Defaults:vagrant !requiretty
トラブルその3: /vagrant のマウントに失敗する
VM起動直後、以下のように共有ディレクトリのマウントが失敗した旨のメッセージが出る場合です。
[default] -- /vagrant The following SSH command responded with a non-zero exit status. Vagrant assumes that this means the command failed! mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant-root /vagrant
Guest Additions がインストールされているかどうか確認する
Guest Additions がないと共有機能は使用できませんので未インストールの場合はインストールする必要があります。
PackerはGuest AdditionsのISOイメージのダウンロードはしてくれますがインストールまではやってくれないので、PackerにGuest Additionsをインストールするスクリプトprovisionersに追加しておきます。またマウントポイントである /vagrant
というディレクトリも事前に作成する必要があります。
#!/bin/bash sudo mkdir /tmp/isomount sudo mount -t iso9660 -o loop /home/vagrant/VBoxGuestAdditions.iso /tmp/isomountsudo /tmp/isomount/VBoxLinuxAdditions.run install sudo umount /tmp/isomount sudo rm -rf /tmp/isomount # マウントポイントを作成しておく sudo mkdir -p /vagrant
"provisioners": [ { "type": "shell", "script": "provisioners/install_vbox_guest_additions.sh" } ],
なおCentOSの場合はインストールに gcc
と kernel-devel
が必要になるので (参考: http://www.virtualbox.org/manual/ch04.html)、Kickstartの実行中や他のprovisionersで事前にインストールしておく必要があります。
投稿者紹介
- サーバ運用もできるプログラマと化した、2013年入社の元新人エンジニアです。
最近のエントリ
- 勉強会2017.03.10ユニキャストの勉強会のご紹介
- Ruby2014.05.16[ruby-install] Rubyのバージョン切替えスクリプトを書いた
- CentOS2014.05.14OpenLDAPサーバーを構築する
- Ruby2013.12.17AutomaticRubyとChatWorkを連携させる