VMのテンプレートは、実はVM と同様に ESXi に紐付けされています。
普段はテンプレートがどこにあるか、あまり気にならないはずです。
しかし、テンプレートを別のESXi に移動するのが結構面倒だということに気づいてしまいました。
一般的な方法で vSphere Client や Web Client から
手作業でテンプレートを移動しようとすると下記のような流れになると思います。
- テンプレートを右クリックして VM に変換する。
- その VMを別のホストに移動する。
- 移動した VM を右クリックし、再びテンプレートに変換する。
これは単調な作業ですが、テンプレートが何十個もあるような場合はとても大変です。
そんなときに、PowerCLI を使用すると
1行のコマンドラインでテンプレートを移動することができます。
VM テンプレートと ESXi の紐付け確認
まず、VMとESXiの紐付けを確認しておきます。
PowerCLI> Get-Template | select Name,@{N="ESXi";E={(Get-VMHost -Id $_.ExtensionData.Runtime.Host).Name}} | ft -AutoSize
Name ESXi
---- ----
oel64-template hv552.vmad.local
oel63-template hv551.vmad.local
oel62-template hv551.vmad.local
VM テンプレートを 別のESXi に移動してみます。
PowerCLI で下記の処理を実行します。
- Set-Template に「-ToVM」を指定することで、テンプレートを VM に変換します。
- Move-VM で VM を移動します。
仮想ディスクを共有データストアに配置していない場合や、
ESXi の紐付けだけでなく格納するデータストアも変更したい場合は
「-Datastore <データストア名>」も指定します。(今回は省略しています) - Set-VM に「-ToTemplate」を指定することで、VM をテンプレートに変換します。
- それぞれのコマンドレットは、パイプ「|」でつなげて実行します。
コマンドラインは、下記のようになります。(1行で記載します)
Set-Template -Template <テンプレート名> -ToVM | Move-VM -Destination (Get-VMHost <移動先ESXi名>) | Set-VM -ToTemplate -Confirm:$false
(実際のコマンドラインの例)
PowerCLI> Set-Template -Template oel64-template -ToVM | Move-VM -Destination (Get-VMHost hv552.vmad.local) | Set-VM -ToTemplate -Confirm:$false
上記の処理をスクリプトにする場合は、あえて
コマンドラインを複数行に分割したほうが読みやすいと思います。
スクリプト例(move_vm_template.ps1)
$template_name = $args[0]
$hv_name = $args[1]
$vm = Set-Template -Template $template_name -ToVM
$vm | Move-VM -Destination (Get-VMHost $hv_name)
$vm | Set-VM -ToTemplate -Confirm:$false
このスクリプトは、下記のようなコマンドラインで実行します。
※先頭のドット・バックスラッシュ(.\)は日本語環境だとYenマークになります。
.\move_vm_template.ps1 <テンプレート名><移動先ESXi名>
(実際のコマンドラインの例)
PowerCLI> .\move_vm_template.ps1 oel63-templatehv554.vmad.local
スクリプトでのVMテンプレート移動~ESXi の確認をしてみたときの実行イメージです。
ちなみに、vCenter 5.5 + PowerCLI 5.1 R2 で試していますが、
vCenter 5.x であれば同様にできるはずです。
以上です。ESXi のVMテンプレート確認&移動についての工夫でした。