はじめに
VMware のスナップショット取得・削除を予めスケジュールしようと言う試みです。
ちなみにスナップショット取得だけであれば vSphere Web Client からできる。
手順は以下。
- 対象の VM を選択
- [監視] を選択し、[タスクおよびイベント] を選択
- 左側のリストから、[スケジュール設定タスク] を選択
- [新規タスクのスケジュール] ドロップダウン メニューから、[スナップショット] を選択
- [スケジュール オプション] ページで、タスクに必要な設定を構成する
参考
スケジュール設定されたタスクの作成
https://docs.vmware.com/jp/VMware-vSphere/6.5/com.vmware.vsphere.vcenterhost.doc/GUID-03B90638-6C70-4379-8CAF-D66866D115F4.html
ちなみにこの方法でスナップショットの削除はできない。
DBが動いている環境などは VM をシャットダウンしてから、スナップショットを取得したい場合があるので 2個タスクを設定する必要がある。
もう少しかゆい所に手が届くように Powershell でスクリプト化してみる。
書き方が汚いのは見逃してほしい。
事前準備
vCenter または ESXi へのログインも自動化するので、事前にパスワードを SecureString のファイルを作成しておく。
Out-File で指定する出力先は自分しかアクセスできない場所にすると良い。
$secureString = ConvertTo-SecureString -string "パスワード" -AsPlainText -Force
$SecureString | ConvertFrom-SecureString | Out-File C:\Users\[ユーザ名]\Documents\auth\vc-admin.pass
事前に PowerCLI をインストールする必要がある。
スナップショット取得スクリプト
「secureString 保存先」と「ログ保存先」は任意の場所に変更が必要。
このスクリプトではシャットダウンされていないとスナップショットは開始されない。
「PowerdOff まで待機」の後ろの6行をコメントアウトすれば、パワーオフ状態か判定せずにすぐにスナップショットを取得する。
「PowerOnの場合シャットダウンをする」のコメントアウトを削除すれば、仮想マシンのシャットダウンをしてからスナップショット取得が開始される。
実行するときは引数に仮想マシン名を指定する。
C:\Users\[ユーザ名]\Documents\log\Script\PowerShell\create_snapshot\create_snapshot.ps1 仮想マシン名
以下がスクリプト。
※自己責任で利用してください。
### 引数で仮想マシン名を指定する
#secureString 保存先
$passfile = "C:\Users\[ユーザ名]\Documents\auth\vc-admin.pass"
#ログ保存先
$logfolder = "C:\Users\[ユーザ名]\Documents\log"
#ログ保存設定
mkdir $logfolder >${NULL} 2>&1
$time = Get-Date -Format "yyyyMMdd-HHmm"
$logpath1 = "$logfolder\$time.log"
#ログ取得開始
Start-Transcript -Path $logpath1 -append
Import-Module VMware.PowerCLI
#パスワード読み込み
$myusername = (Get-ChildItem Env:\USERNAME).Value
$loginusername = [string]::Concat($myusername)
$importSecureString = Get-Content $passfile | ConvertTo-SecureString
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($importSecureString)
$Password = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
#VC接続
Connect-VIServer -Server i3vcsv11 -User $loginusername -Password $Password -Force
Write-Host ""
$vmname = $Args[0]
$vm=Get-VM $vmname
$snapname = $vmname + "_" + (Get-Date).ToString("yyyyMMdd-HHmm")
#PowerOnの場合シャットダウンをする
#if ($vm.PowerState -eq 'PoweredOn'){
# Write-Host $vmname "is PowerOn"
# #Shutdown-VMGuest -VM $vm -Confirm:$false #シャットダウン実行
#}
#PowerdOff まで待機
while ($vm.PowerState -ne 'PoweredOff'){
Write-Host $vmname "is still PowerOn"
Start-Sleep -Seconds 5 #5秒待機
$vm=Get-VM $vmname #最新のステータス取得
Write-Host "PowerState:" $vm.PowerState
}
New-Snapshot -VM $vmname -Name $snapname #スナップショット取得
Write-Host "■"$vmname "Snapshot List"
Write-Host "--------------------------------------------------------------------"
Get-VM -name * | Get-Snapshot | Where-Object{$_.VM -like $vmname} | Format-Table VM,Created,Name,SizeGB -A #スナップショット取得状況
Write-Host "--------------------------------------------------------------------"
#Start-VM -VM $vm #PowerOn する場合は有効化する
Disconnect-VIServer -Server * -Confirm:$false #切断
Stop-Transcript #ログ取得終了
Remove-Variable -Name x -Force -ErrorAction Ignore #変数リセット
スナップショット削除スクリプト
「secureString 保存先」と「ログ保存先」は任意の場所に変更が必要。
実行するときは引数に仮想マシン名とスナップショット名を指定する。
C:\Users\[ユーザ名]\Documents\log\Script\PowerShell\create_snapshot\remove-snapshot_ps1 仮想マシン名 スナップショット名
以下がスクリプト。
※自己責任で利用してください。
### 引数で仮想マシン名を指定する
#secureString 保存先
$passfile = "C:\Users\[ユーザ名]\Documents\auth\vc-admin.pass"
#ログ保存先
$logfolder = "C:\Users\[ユーザ名]\Documents\log"
#ログ保存設定
mkdir $logfolder >${NULL} 2>&1
$time = Get-Date -Format "yyyyMMdd-HHmm"
$logpath1 = "$logfolder\$time.log"
#ログ取得開始
Start-Transcript -Path $logpath1 -append
Import-Module VMware.PowerCLI
#パスワード読み込み
$myusername = (Get-ChildItem Env:\USERNAME).Value
$loginusername = [string]::Concat($myusername)
$importSecureString = Get-Content $passfile | ConvertTo-SecureString
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($importSecureString)
$Password = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
#VC接続
Connect-VIServer -Server i3vcsv11 -User $loginusername -Password $Password -Force
Write-Host ""
$vmname = $Args[0]
$snapshot1 = $Args[1]
#スナップショット削除
Get-VM -name $vmname | Get-Snapshot | Where-Object{$_.Name -like $snapshot1} | Remove-Snapshot -Confirm:$false
Write-Host "■"$vmname "Snapshot List"
Write-Host "--------------------------------------------------------------------"
Get-VM -name * | Get-Snapshot | Where-Object{$_.VM -like $vmname} | Format-Table VM,Created,Name,SizeGB -A #スナップショット取得状況
Write-Host "--------------------------------------------------------------------"
#Start-VM -VM $vm #PowerOn する場合は有効化する
Disconnect-VIServer -Server * -Confirm:$false #切断
Stop-Transcript #ログ取得終了
Remove-Variable -Name x -Force -ErrorAction Ignore #変数リセット
タスクの設定
指定した時間に自動的実行するために Windows のタスクスケジューラでタスク設定をする。
Windows であればクライアントでもサーバ問題無い。
以下は時間を指定して実行する場合のタスクスケジューラに設定例。
名前 | スナップショット取得_1 |
トリガー | 1回限り |
操作 | プログラム開始 |
プログラム | %Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe |
引数の追加 | -Command “C:\Users[ユーザ名]\Documents\log\Script\PowerShell\create_snapshot\create_snapshot.ps1” 仮想マシン名 |
名前 | スナップショット削除_1 |
トリガー | 1回限り |
操作 | プログラム開始 |
プログラム | %Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe |
引数の追加 | -Command “C:\Users[ユーザ名]\Documents\log\Script\PowerShell\create_snapshot\remove-snapshot_ps1” 仮想マシン名 仮想マシン名_yyyyMMdd |
スナップショット確認
スナップショットの保存状況をコマンドで確認する方法もあるので参考まで。
#モジュールインポート
# Import-Module VMware.PowerCLI
#VC接続
# Connect-VIServer -Server [vCenterのIPまたはDNS名] -User [ユーザ名] -Password [パスワード]
#スナップショット一覧表示
# Get-VM -name * | Get-Snapshot |Format-Table VM,Created,Name,SizeGB -A
#切断
# Disconnect-VIServer -Server * -Confirm:$false
まとめ
スナップショットは VMware の公式的なアナウンスでは 72時間までとするように記載されている。
72時間以上スナップショットを残してしまうこともよくあるので、予め削除までスケジュールすると安心。
ちなみに実際は72時間以上スナップショットを残していても大事になることはすくない、、
コメント