vagrant スナップショットの管理

## 概要
Vagrant 1.8 で snapshot が標準で使えるようになった。
ただ、表示順などのオプションが見当たらず不便なので、保存時に自動で番号・日時をスナップショット名に付与し、復元時は番号の指定で復元できるように snapshot コマンドをシェルスクリプトでラップする。

## 環境
・Windows10 + Vagrant 1.8.1 + Git Bash(by Git for Windows 2.7.4)
・仮想マシンは１台前提(=defualtのみ)

## 実装

ユーザーのホーム(~＝C:/Users/＜ユーザー名＞)に.bashrcを作成して、シェルスクリプトでエイリアス・関数を記述する。
~/.bashrcを作成した後、GitBashを起動すると~/.bash_profileが自動で作成されて.bashrcが読み込まれる。

```bash:~/.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 {}
}
```

## 実行

・スナップ一覧 → スナップショットなし

```bash:~/.bashrc
$ 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!                                
```

・スナップ追加

```bash:~/.bashrc
$ 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`.                                  
```

・スナップ一覧 → スナップショット１件

```bash:~/.bashrc
$ vagsnaps
0001_160403_2338_first-save
```

・スナップもう１件追加

```bash:~/.bashrc
$ 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`.
```

・スナップ一覧 → スナップショット２件

```bash:~/.bashrc
$ vagsnaps
0002_160403_2344_second-save
0001_160403_2338_first-save
```

・スナップ復元 → 1を指定 → 0001_160403_2338_first-save を復元

```bash:~/.bashrc
$ 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 追記：コピペし易いように実装を１か所へまとめた