概要
Vagrant 1.8 で snapshot が標準で使えるようになった。
ただ、表示順などのオプションが見当たらず不便なので、保存時に自動で番号・日時をスナップショット名に付与し、復元時は番号の指定で復元できるように snapshot コマンドをシェルスクリプトでラップする。
環境
・Windows10 + Vagrant 1.8.1 + Git Bash(by Git for Windows 2.7.4)
・仮想マシンは1台前提(=defualtのみ)
実装
ユーザーのホーム(~=C:/Users/<ユーザー名>)に.bashrcを作成して、シェルスクリプトでエイリアス・関数を記述する。
~/.bashrcを作成した後、GitBashを起動すると~/.bash_profileが自動で作成されて.bashrcが読み込まれる。
# スナップショット保存:連番+日時を自動で付与
# Usage: vagsave [<snap-name>]
# --> nnnn_yymmdd_HHMM_<snap-name>として保存
function vagsave() {
local isFirst=$(vagrant snapshot list | grep ' No snapshots' | wc -l)
if [ ${isFirst} -eq 1 ] ; then
echo $1 | xargs -I{} printf "0001_%s_%s" `date "+%y%m%d_%H%M"` {} | xargs -I{} vagrant snapshot save {}
else
echo $1 | xargs -I{} printf "%04d_%s_%s" $(( 1 + `vagrant snapshot list | wc -l`)) `date "+%y%m%d_%H%M"` {} | xargs -I{} vagrant snapshot save {}
fi
}
# スナップショット一覧:時系列降順に表示、番号を確認
alias vagsnaps='vagrant snapshot list | tac -'
# スナップショット復元:番号を指定して復元
# Usage: vagrestore <seq>
# --> <seq> -> nnnn
# --> nnnn_yymmdd_HHMM_<snap-name>を復元
function vagrestore() {
local snap=$(printf "%04d_*" $1)
vagrant snapshot list | grep ${snap} | xargs -I{} vagrant snapshot restore {}
}
# スナップショット削除:番号を指定して削除
# Usage: vagdel <seq>
# --> <seq> -> nnnn
# --> nnnn_yymmdd_HHMM_<snap-name>を削除
function vagdel() {
local snap=$(printf "%04d_*" $1)
vagrant snapshot list | grep ${snap} | xargs -I{} vagrant snapshot delete {}
}
実行
・スナップ一覧 → スナップショットなし
$ vagsnaps
default: `vagrant snapshot restore` to go back to a certain snapshot.
default: can list them using this command, and use commands such as
default: not all providers support this yet. Once a snapshot is taken, you
default: You can take a snapshot using `vagrant snapshot save`. Note that
==> default: No snapshots have been taken yet!
・スナップ追加
$ vagsave first-save
==> default: Snapshotting the machine as '0001_160403_2338_first-save'...
==> default: Snapshot saved! You can restore the snapshot at any time by
==> default: using `vagrant snapshot restore`. You can delete it using
==> default: `vagrant snapshot delete`.
・スナップ一覧 → スナップショット1件
$ vagsnaps
0001_160403_2338_first-save
・スナップもう1件追加
$ vagsave second-save
==> default: Snapshotting the machine as '0002_160403_2344_second-save'...
==> default: Snapshot saved! You can restore the snapshot at any time by
==> default: using `vagrant snapshot restore`. You can delete it using
==> default: `vagrant snapshot delete`.
・スナップ一覧 → スナップショット2件
$ vagsnaps
0002_160403_2344_second-save
0001_160403_2338_first-save
・スナップ復元 → 1を指定 → 0001_160403_2338_first-save を復元
$ vagrestore 1
==> default: Forcing shutdown of VM...
==> default: Restoring the snapshot '0001_160403_2338_first-save'...
==> default: Clearing any previously set forwarded ports...
==> default: Setting hostname...
……(snip)………
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
default: /vagrant => C:/Work/test_x
備考
・linux不慣れで妥協したが、多分全部aliasで出来そう
・restore候補をタブ補完できないかと調べたが(complete云々)、
よくわかってない&snapshot list の応答に時間がかかるので明示的に番号指定にした
・4/5 追記:コピペし易いように実装を1か所へまとめた