Vagrantで作った環境のコピー方法

Vagrant

毎回アホの様に忘れるので、記録しとくよっ。

Vagrantで作業していて、環境コピーして、環境内のOSやらミドルウェアのアップグレードと、アップグレード後の環境で、システムが正常に動作するかのテストや、動かない場合のプログラム修正とかって、OSやミドルウェアのサポート期限が切れる頃にやるんだけど、毎回うろ覚えなんでアウトプットすればもう少し記憶されるかなと。

流れは簡単で、

boxファイルを作成

コピー先Vagrant環境初期化

Vagrantファイルを編集

boxファイルはVagrantに登録して、登録したboxで初期化する方法もあるけど好きな方法でどうぞ。

boxファイルの作成

作業ディレクトリで、

$ vagrant package --output [名前.box]

とするか、VM名を指定して作成する。

$ vagrant package [VM名] --output [名前.box]

VM名を忘れた場合は、statusコマンドで確認

$ vagrant status
Current machine states:

default poweroff (virtualbox)
~~~~~~~
The VM is powered off. To restart the VM, simply run vagrant up

こんな感じ。

$ vagrant package default --output myproject.box
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: D:/Vagrant/myproject/myproject.box

コピー先Vagrant環境初期化

コピー先となるディレクトリを作成して、分かりやすくそこに先ほどのboxファイルをコピー。

そのディレクトリで、Vagrantを初期化

$ vagrant init
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ファイルを編集

Vagrantファイル内のboxファイルの下記部分を修正
Windowsの場合、フルパスじゃないとダメでした。

config.vm.box = "base"
↓
config.vm.box = "D:\\Vagrant\myproject\myproject.box"

その他の設定環境も必要に応じてコピーして起動!

$ vagrant up

無事起動!

ちなみにboxファイルをVagrantに登録する方法はこちら

$ vagrant box add [任意のVM名] [名前.boxのパス] 
例:vagrant box add myprojectx ./myproject.box

$ vagrant box list
vagrant box list
myprojectx                         (virtualbox, 0)
generic/centos8                    (virtualbox, 3.0.32)

$ vagrant init myprojectx

あとは、Vagrantファイルを編集して、起動するだけ。

問題は、Vagrantに登録されたboxファイルの実体ファイルがどこに作られるかだよね。

Windowsの場合、登録したboxファイルは下記ディレクトリに、

C:\Users\ユーザー名\.vagrant.d\boxes

初期化して作成したVMは下記ディレクトリに保存される。

C:\Users\ユーザー名\VirtualBox VMs

boxファイルはディレクトリを削除しても消せるが、コマンドラインかも削除はできる。

$ vagrant box remove [BOX名]

VMはコマンドラインで登録されているVM一覧を確認し、コンテナIDを指定することで削除できる。

$ vagrant global-status
-------------------------------------------------------------------------
1e765ed  default virtualbox poweroff D:/Vagrant/myproject
6a74de3  default virtualbox poweroff D:/Vagrant/myprojectx

$ vagrant destroy 6a74de

よし、少しは記憶が定着したかな。

不要になったboxを削除する際に注意すること

後日談ですが、使用済みになったboxを削除すると、

 default: Warning: Authentication failure. Retrying...
 default: Warning: Authentication failure. Retrying...
 default: Warning: Authentication failure. Retrying...
:

と、SSHの認証ができずループして、正常に起動しなくなりました。

vb.gui = true

として、起動時にVirtualBoxを起動させるようにしてみると、ログイン画面までは起動している様子。しかし、ログインしてSSHDの起動状態を確認してみて正常に起動しているが、外部からSSH接続はできず。なんか、Vagrantfileの設定が反映されていない様な感じ。

調べてみると、登録されたboxファイル内にある秘密鍵を使って自動的にSSHログインを行う様で、boxファイルを削除してしまうと、VagrantのGlobalな秘密鍵を使ってログインしようとするため、ログインできない様子。(これに気付くのに数時間かかったよ。)

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/[ユーザー名]/.vagrant.d/boxes/[BOX名 OR BOX読み込み時のディレクトリ]/0/virtualbox/vagrant_private_key
  IdentitiesOnly yes
  LogLevel FATAL

この「IdentityFile」のファイルがログイン用の秘密鍵ファイル。

boxのディレクトリを削除すると、

IdentityFile C:/Users/[ユーザー名]/.vagrant.d/insecure_private_key

が参照されるようになってしまう。

なので、IdentityFile の vagrant_private_key をコピーしておく。

今回は分かりやすくVagrantファイルと同じ場所にコピーし、Vagrantファイルで、この秘密鍵ファイルを使うように指定してあげる。

  config.ssh.insert_key = false
  config.ssh.private_key_path = "D:\\Vagrant\projectx\\vagrant_private_key"

という感じで、秘密鍵ファイルをしてしてあげると、無事起動できるようなり、不要になったboxファイルも削除できて、ゴミが減って気分もスッキリ。

Add comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください