CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
サーバーを構築して運用していると、日々の運用を自動化するためにバッチファイルを作って定期的に自動タスクで実行することは珍しくありません。例えばHyper-Vを使った仮想化システムの場合でもPowerShellを使って自動化をすることができます。今回はPowerShellの基本的な操作と、PowerShellによるHyper-V環境の管理について書いていきます。
PowerShell は当初Windows Server 2003 や Windows Vista へのアドオンの形でリリースされていましたが、Windows Server 2012 R2 ではPowerShellが標準搭載されています。
このPowerShellは.ps1という拡張子のファイルにテキストベースでコマンドを書き込むことでバッチとして実行することができます。もちろん Windows のタスクとして実行することも可能です。PowerShell のコマンド体系はある程度統一されていて、Get-XX や Remove-XX など推測しやすい形なので、ある程度慣れてくるとコマンドを知らなくてもインテリセンスとヘルプを利用して目的の操作に到達することができます。PowerShellの基本的な使い方はWeb上に情報がたくさんありますし、Microsoftでは動画でも学習できるようにしていますので興味があれば見てみてください。また、Windows Server 2012 R2 ではほとんどの機能をPowerShellで操作することが可能です。Windows Server 2012 R2 用のリファレンスは Web サイト(https://technet.microsoft.com/library/dn249523.aspx) で参照できます。
それでは早速 PowerShell を使って Hyper-V を操作してみます。まずは Windows PowerShell を起動します。アプリケーションの一覧では Windows システム ツールの中にありますし、[ファイル名を指定して実行] から PowerShell を実行してもかまいません。
まずは仮想マシンの一覧を取得します。 Get-VM と入力して実行します。すると仮想マシンの一覧とそれぞれのCPUの使用率、メモリの割り当て量などが表示されます。
仮想マシンの台数が多いので、仮想マシン名に "WAP" という文字列が含まれている仮想マシンだけを抽出したいと思います。この場合は Get-VM | Where-Object {$_.Name like "*WAP*"} と入力して実行します。
Where-Object コマンドレットによって、ほかのコマンドレットから返されたデータをフィルタすることができます。今回は like 演算子を使用していますが、他の演算子を使用することで完全一致するデータのみを表示したり、指定値より大きいデータを表示したりできます。 Where-Object コマンドレットについては こちら を確認してください。
次に仮想マシンを停止させてみます。仮想マシンを停止するには Stop-VM コマンドレットを使います。 Stop-VM Name <仮想マシン名> -Force と入力して実行します。コマンドを実行したら Get-VM を使って状態を確認し、 [State] が Off になっていることを確認します。
ここで Stop-VM コマンドに Force オプションを指定したのは、仮想マシンをユーザーロックしている場合にも強制的にシャットダウンするためです。もし Force オプションを指定せず、仮想マシンがロックされている場合はエラーが発生します。
次に仮想マシンを起動します。仮想マシンの起動には Start-VM コマンドを利用します。Start-VM Name <仮想マシン名> と入力して実行します。その後 Get-VM コマンドを使って [State] が Running に変わっていることを確認します。
次に、複数の仮想マシンをまとめて操作してみます。PowerShellは For 文や While 文も使えますが、今回は別の方法を使います。先のGet-VMの説明でWhere-Objectを使いましたが、Get-VMで取得した仮想マシンに対して Stop-VM を実行します。そのためには
Get-VM | Where-Object {$_.Name -like "*WAP*"} | Stop-VM Force のように入力して実行します。この場合、仮想マシン名に"WAP"という文字が含まれる仮想マシンを順番にシャットダウンします。ここでポイントになるのは順番ということです。対象を同時にシャットダウンするのではなく、1つずつシャットダウンしていくので、対象の仮想マシンの台数が多い場合は時間がかかります。もし、他の仮想マシンのシャットダウンを待つ必要がない場合は Get-VM | Where-Object {$_.Name -like "*WAP*"} | Stop-VM Force AsJob のようにAsJobオプションを追加して実行します。こうすることでStop-VMコマンドはバックグラウンド処理となり、シャットダウンを待つことはありません。
コマンドでバッチファイルを作っている場合、少し書いては実行して動作を確認することがよくありますが、PowerShellの場合は WhatIf という便利なオプションがあります。例えば、仮想マシンを起動する Start-VM コマンドに WhatIfオプションをつけて実行すると、実際に仮想マシンを起動するのではなく、このコマンドによって何が起きるのかを表示してくれます。
先の複数台まとめてシャットダウンするような、少し複雑なコマンドを書いた場合は WhatIf オプションを使うことで意図した結果になるかを確認することができます。
毎日決まった時間に仮想マシンを起動したりシャットダウンしたりする場合にPowerShellでバッチファイルを作成して Windows のタスクで実行することは良くありますが、その他に定期的にチェックポイント(スナップショット)を作成するために使うこともあるようです。1時間に一度チェックポイントを採取して何か起きた場合にロールバックできるようにしておき、夜に仮想マシンのエクスポートとチェックポイントのマージをするようなケースです。
チェックポイントを作成するには Checkpoint-VMコマンドを使います。 Checkpoint-VM Name <仮想マシン名> と入力して実行します。また、仮想マシンのチェックポイントの一覧を表示する場合は Get-VMSnapshot VMName <仮想マシン名> と入力して実行します。
仮想マシンをエクスポートするには Export-VM コマンドを使います。Export-VM Name <仮想マシン名> -Path <保存先> と入力して実行します。
チェックポイントを削除する場合はRemove-VMSnapshot コマンドを使います。 Remove-VMSnapshot VMName <仮想マシン名> と入力して実行すると対象の仮想マシンのすべてのスナップショットを削除します。
その他のHyper-Vで利用可能なコマンドは こちら にリスト化されていますので、一度眺めてみることをお勧めします。最近はインフラの運用は自動化してオペレーションミスを減らしたり、人的リソースを削減したりする傾向が強くなってきていますし、Windows Server の機能の中にはGUIでは設定できず、PowerShellで設定する」オプションパラメーターなどがあり、PowerShell の重要性は増しています。 ぜひPowerShellの使い方をマスターしてみてください!
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes