UPS Virtual Report

仮想マシンをSC21でシャットダウンしてみよう

VMware

オムロンソーシアルソリューションズのSE村井と申します。

本日は、vSphere 環境の仮想マシンをネットワークカード「SC21」でシャットダウンする方法をご紹介していきます。

この記事を見ると何ができるようになる?

  • vSphere環境の仮想マシンを「SC21」でシャットダウンできるようになります。

どんな人向け?

  • vSphere環境のシャットダウン、起動の自動化を担当している。
  • 停電時にUPSと連携してvSphere環境を自動でシャットダウンしたい。
  • 復電時にUPSと連携してvSphere環境を自動で起動したい。
  • ESXiやLinuxのCUIにあまり慣れていない。

CUIでの確認

「SC21」は、SSHで接続し、接続した先で実行するコマンドを記述したスクリプトを発行する「スクリプトシャットダウン機能」を持っています。スクリプトシャットダウン機能を使って、vSphere環境の仮想マシンをシャットダウンします。

SSHの接続先はESXiです。
ESXiに接続し、ESXiで実行可能なコマンドを利用して、仮想マシンをシャットダウンします。

それでは、実際にTera TermでESXiにSSH接続し、コマンドを実行しながら説明します。

ESXiにSSHで接続します。
仮想マシンをシャットダウンするためには、vim-cmd vmsvc/power.shutdownを使用します。
vim-cmd vmsvc/と入力すると、vim-cmd vmsvc/で使用可能なコマンドの一覧を表示できます。

[root@localhost:~] vim-cmd vmsvc/
Commands available under vmsvc/:
acquiremksticket
acquireticket
createdummyvm
destroy
device.connection
device.connusbdev
device.ctlradd
device.ctlrremove
device.disconnusbdev
device.diskadd
device.diskaddexisting
device.diskextend
device.diskremove
device.getdevices
device.nvdimmadd
device.nvdimmremove
device.toolsSyncSet
devices.createnic
get.capability
get.config
get.config.cpuidmask
get.configoption
get.datastores
get.disabledmethods
get.environment
get.filelayout
get.filelayoutex
get.guest
get.guestheartbeatStatus
get.managedentitystatus
get.networks
get.runtime
get.snapshotinfo
get.spaceNeededForConsolidation
get.summary
get.tasklist
getallvms
gethostconstraints
message
power.getstate
power.hibernate
power.off
power.on
power.reboot
power.reset
power.shutdown
power.suspend
power.suspendResume
queryftcompat
reload
setscreenres
snapshot.create
snapshot.dumpoption
snapshot.get
snapshot.remove
snapshot.removeall
snapshot.revert
snapshot.setoption
tools.cancelinstall
tools.install
tools.upgrade
unregister
upgrade

本記事では仮想マシンの電源制御に関するコマンドだけをご紹介します。どのコマンドもvmidが引数として必要になります。

なお、仮想マシンにVMware Toolsをインストールしている場合は、vim-cmd vmsvc/power.shutdownを実行できますが、インストールしていない場合は、vim-cmd vmsvc/power.offを使用します。

[root@localhost:~] vim-cmd vmsvc/power.shutdown
Insufficient arguments.
Usage: power.shutdown vmid

Shutdown the guest OS

[root@localhost:~] vim-cmd vmsvc/power.off
Insufficient arguments.
Usage: power.off vmid

Power off the specified virtual machine.

[root@localhost:~] vim-cmd vmsvc/power.on
Insufficient arguments.
Usage: power.on vmid

Power on the specified virtual machine.

vmidを取得するには、vim-cmd vmsvc/getallvmsを使用します。

[root@localhost:~] vim-cmd vmsvc/getallvms
VmidNameFileGuest OSVersion
Annotation
14VA_Ver220[NetAppDatastore] VA_Ver220/VA_Ver220.vmxfreebsd64Guestvmx-07
15vCLS (2)[NetAppDatastore] vCLS (2)/vCLS (2).vmx other3xLinux64Guestvmx-11
vSphere Cluster Service VM is deployed from an OVA with a minimal installed profile of
PhotonOS. vSphere Cluster Service manages the resources, power state and availability of these VMs.
vSphere Cluster Service VMs are required for maintaining the health and availability of vSphere Cluster
Service. Any impact on the power state or resources of these VMs might degrade the health of the
vSphere Cluster Service and cause vSphere DRS to cease operation for the cluster.
16WEBSV-1[NetAppDatastore] WEBSV-1/WEBSV-1.vmxrhel8_64Guestvmx-19
17WEBSV-2[NetAppDatastore] WEBSV-2/WEBSV-2.vmxrhel8_64Guestvmx-19
18WEBSV-3[NetAppDatastore] WEBSV-3/WEBSV-3.vmxrhel8_64Guestvmx-19
19WEBSV-4[NetAppDatastore] WEBSV-4/WEBSV-4.vmxrhel8_64Guestvmx-19
20Win10-001[NetAppDatastore] Win10-001/Win10-001.vmxwindows9_64Guest
vmx-19
21DBSV-01[NetAppDatastore] DBSV-01/DBSV-01.vmxwindows2019srv_64Guest
vmx-19
22Win10-002[NetAppDatastore] Win10-002/Win10-002.vmxwindows9_64Guest
vmx-19
23Win10-003[NetAppDatastore] Win10-003/Win10-003.vmxwindows9_64Guest
vmx-19

vmidを取得できましたので、”Win10-001(vmid:20)”をシャットダウンしてみます。

[root@localhost:~] vim-cmd vmsvc/power.shutdown 20

シャットダウンは無事成功しました。
ESXiでコマンドを実行しているため、VMware Host Client ※1の最近のタスクに表示されますが、
vSphere Client ※2 の最近のタスクには表示されません。
※1 ESXiにアクセスし操作する際に使うGUIベースのインターフェース
※2 vCenter Serverにアクセスし操作する際に使うGUIベースのインターフェース

ESXiを単独で使用している環境ではvmidを直接入力しても問題ないですが、ESXiが複数ノードある場合は考慮が必要です。
vmidはESXiごとに採番されますので、ESXi #1上で動いている仮想マシン”Win10-001”をESXi #2にvMotionした場合、ESXi #2上では別のvmidが採番される可能性があります。

また、ESXi #2にvMotion した仮想マシン”Win10-001”を、ESXi #1にvMotionして戻した場合、ESXi #1上で元々採番していたvmidと異なる可能性もあります。
そのため、シャットダウンを自動化するためには、シャットダウン直前でvmidを取得し、その取得した値を使用してシャットダウンする必要があります。

パイプとgrepコマンドとawkコマンドを組み合わせて使用することで、それが実現できます。
パイプとは「|」を指しますが、パイプの前で実行したコマンド結果を、パイプの後のコマンドに渡します。
vim-cmd vmsvc/getallvms | grep ○○の場合、
vim-cmd vmsvc/getallvmsで出力された結果をgrepコマンドに渡すという意味になります。
grepコマンドは、対象の文字列を検索し、検索にヒットした行のみを出力してくれます。
ここではシャットダウンしたい仮想マシンを絞るため使用しています。
awkコマンドは、シャットダウンに必要なvmidだけを出力するために使用しています。

例えば、vim-cmd vmsvc/getallvmsで出力した結果を”Win10-001”という仮想マシンだけに絞りたい場合は、grepの後に”Win10-001”と入力します。

[root@localhost:~] vim-cmd vmsvc/getallvms | grep "Win10-001"
20Win10-001 [NetAppDatastore] Win10-001/Win10-001.vmx windows9_64Guest
vmx-19

例えば、vim-cmd vmsvc/getallvmsで出力した結果を”Win10”という名前のついた仮想マシンに絞りたい場合は、grepの後に”Win10”とだけ入力します。

[root@localhost:~] vim-cmd vmsvc/getallvms | grep "Win10"
20Win10-001[NetAppDatastore] Win10-001/Win10-001.vmx windows9_64Guest
vmx-19
22Win10-002[NetAppDatastore] Win10-002/Win10-002.vmx windows9_64Guest
vmx-19
23Win10-003[NetAppDatastore]Win10-003/Win10-003.vmx windows9_64Guest
vmx-19

結果、Win10-001とWin10-002とWin10-003という3台の仮想マシンの情報を取得できました。

次に、”Win10-001”という仮想マシンのvmidを取得したい場合は、grepコマンドに加えてawkコマンドをパイプでつなぎます。print $1を指定することで、1列目の情報のみを出力できます。

[root@localhost:~] vim-cmd vmsvc/getallvms | grep "Win10-001" | echo `awk '{print $1}'`
20

2列目、3列目、4列目の情報を取得したい場合は、printの後の値を変えます。

[root@localhost:~] vim-cmd vmsvc/getallvms | grep "Win10-001" | echo `awk '{print $2}'`
Win10-001
[root@localhost:~] vim-cmd vmsvc/getallvms | grep "Win10-001" | echo `awk '{print $3}'`
[NetAppDatastore]
[root@localhost:~] vim-cmd vmsvc/getallvms | grep "Win10-001" | echo `awk '{print $4}'`
Win10-001/Win10-001.vmx

これで、シャットダウンしたい仮想マシンを絞ることと、vmidだけを取得することができましたので、”Win10-001”をシャットダウンします。
echoコマンドをvim-cmd vmsvc/power.shutdownに変更するだけです。

[root@localhost:~] vim-cmd vmsvc/getallvms | grep "Win10-001" | vim-cmd vmsvc/power.shutdown
`awk '{print $1}'`

grepする文字列をVMという変数に入れて実施することも可能です。
この場合は、パイプで渡すのではなく、セミコロンで処理を繋げます。
セミコロンは複数のコマンドを続けて実行する場合に使用します。

[root@localhost:~] VM=”Win10-001”; vim-cmd vmsvc/getallvms | grep $VM | vim-cmd
vmsvc/power.shutdown `awk '{print $1}'`

ここまでは、ある任意の仮想マシン 1台をシャットダウンする方法でしたが、複数台をまとめてシャットダウンしたい場合は、for文を使用します。

[root@localhost:~] for i in `vim-cmd vmsvc/getallvms | grep "Win10" | awk '{print $1}'`; do echo $i;done
20
22
23

結果、Win10-001とWin10-002とWin10-003という3台の仮想マシンのvmidを取得できました。

3台の仮想マシンのvmidを取得できましたので、echoコマンドをvim-cmd vmsvc/power.shutdownに変更し、シャットダウンしてみます。

[root@localhost:~] for i in `vim-cmd vmsvc/getallvms | grep "Win10" | awk '{print $1}'`; do vim-cmd vmsvc/power.shutdown $i;done

結果、Win10-001とWin10-002とWin10-003という3台の仮想マシンをシャットダウンできました。

grepコマンドのオプションを使用することで、ある対象の仮想マシンだけを除いた全仮想マシンをシャットダウンすることも可能です。
最初のgrepでは、すべての仮想マシンがヒットするように”.vmx”とし、その後のgrepにはvオプションを付けて”
Win10-002”を除くようにしています。

[root@localhost:~] for i in `vim-cmd vmsvc/getallvms | grep ".vmx" | grep -v "Win10-002" | awk '{print
$1}'`; do echo $i;done
14
15
16
17
18
19
20
21
23

vCLSだけ除いた仮想マシン全て、およびvCenter Serverだけを除いた仮想マシン全てを対象としたいときなどに使用できると考えています。

また、-e <仮想マシン名>を続けて記載することで、複数台の仮想マシンを直接指定することも可能です。
この例では、”Win10-001”と”Win10-003”を指定しています。

[root@localhost:~] for i in `vim-cmd vmsvc/getallvms | grep -e "Win10-001" -e "Win10-003" | awk
'{print $1}'`; do echo $i;done
20
23

コマンドで仮想マシンをシャットダウンする方法については以上です。
この後は、これらのコマンドを「SC21」に登録し、「SC21」からシャットダウンを実行する方法をご説明します。

「SC21」で設定

「SC21」にWebブラウザでアクセスし、ログインします。
>UPS管理>スクリプト&スケジュール>「スクリプトシャットダウン」タブで以下を実施します。

項目 実施内容
プロトコル SSHをプルダウンから選択します。
条件 「シャットダウン」をプルダウンから選択します。(デフォルトのまま)
ログインID 1 ESXiにSSHでログインするときのIDを入力します。
パスワード 1 ESXiにSSHでログインするときのパスワードを入力します。

画面を右スクロールして、以下を実施します。

項目 実施内容
スクリプト待機時間(秒) スクリプトを実行するタイミングをここで調整します。
入力電源異常時は、待機時間※+設定した値の秒数を待ち、スクリプトを実行します。
スクリプトNo. 新規でスクリプトを作成する場合は、スクリプト20以降を選択します。
スクリプト20以降を選択すると、表示ボタン横の枠は空白になります。
「Win10-Shutdown」など、何の用途かわかるような名前を任意で入力してください。

スクリプト内容の横にある「表示」ボタンを押下し、以下内容を貼り付け、必要に応じて変更します。
実施後、画面下部にある「設定」ボタンを押下します。

スクリプトNo. スクリプト内容
(名前)
スクリプト内容
(実際のスクリプト)
スクリプト20 Win10-Shutdown rcv=login:
snd=$u1
rcv=Password:
snd=$p1
rcv=]
snd=for i in `vim-cmd vmsvc/getallvms | grep "Win10" | awk
'{print $1}'`; do vim-cmd vmsvc/power.shutdown $i;done

Win10”という文字列で検索し、ヒットした仮想マシンシャットダウンするスクリプトとなります。
必要に応じて、”Win10”をご変更ください。
先に述べた通り、grepコマンドにオプションを付けたりしながら、実施したいことができるかお試しください。

  ※ 待機時間とは、以下画面(>UPS管理>UPS設定>「シャットダウン設定」タブ) で設定する時間で、イベント発生からシャットダウン動作(クライアントシャットダウン又はクライアントシャットダウン/UPS 停止)を開始するまでの時間設定です。 待機時間内にイベントが解消すれば、シャットダウンは開始されません。

以上で、vSphere環境の仮想マシンを「SC21」でシャットダウンするための設定は完了です。

それでは、設定がうまくいくか確認してみましょう。
先ほど、スクリプトを設定した画面(>UPS管理>スクリプト&スケジュール>「スクリプトシャットダウン」タブ)で、スクリプトを一つ一つ実行して確認できます。
実行したいスクリプトのチェックボックスにチェックを入れ、「テスト」ボタンを押下します。

「テスト」ボタン押下後に仮想マシンがシャットダウンされない方は、IPアドレス、ログインID、パスワードに誤りがないかご確認ください。
スクリプト待機時間で0以外の値を設定した場合、「テスト」ボタン押下時もその設定した値の分だけスクリプトの発行を待ちますので、すぐに実行したい場合は、一旦値を0に変更いただき、「設定」ボタン押下後、再度「テスト」ボタンを押下ください。

“Win10”という文字列でヒットする仮想マシンの次は”WEBSV”、その次は”DBSV”、その次はvCLS以外の仮想マシン全てというシャットダウン順番を実現したい場合は以下のような設定になります。

No. IPアドレス プロトコル 条件 スクリプト
待機時間
スクリプトNo. スクリプト名称
1 ESXiのIP SSH シャットダウン 0 スクリプト20 Win10-shutdown
2 ESXiのIP SSH シャットダウン 30 スクリプト21 WEBSV-shutdown
3 ESXiのIP SSH シャットダウン 60 スクリプト22 DBSV-shutdown
4 ESXiのIP SSH シャットダウン 90 スクリプト23 VM-except-vCLS

※赤文字の箇所を皆さんの環境に合わせてご変更ください。

スクリプトNo. スクリプト内容
(名前)
スクリプト内容
(実際のスクリプト)
スクリプト20 Win10-Shutdown rcv=login:
snd=$u1
rcv=Password:
snd=$p1
rcv=]
snd=for i in `vim-cmd vmsvc/getallvms | grep "Win10" | awk
'{print $1}'`; do vim-cmd vmsvc/power.shutdown $i;done
スクリプト21 WEBSV-shutdown rcv=login:
snd=$u1
rcv=Password:
snd=$p1
rcv=]
snd=for i in `vim-cmd vmsvc/getallvms | grep "WEBSV" | awk
'{print $1}'`; do vim-cmd vmsvc/power.shutdown $i;done
スクリプト22 DBSV-shutdown rcv=login:
snd=$u1
rcv=Password:
snd=$p1
rcv=]
snd=for i in `vim-cmd vmsvc/getallvms | grep "DBSV" | awk
'{print $1}'`; do vim-cmd vmsvc/power.shutdown $i;done
スクリプト23 VM-except-vCLS rcv=login:
snd=$u1
rcv=Password:
snd=$p1
rcv=]
snd=for i in `vim-cmd vmsvc/getallvms | grep ".vmx”" | grep -v
"vCLS”" | awk '{print $1}'`; do vim-cmd vmsvc/power.shutdown $i;done

※赤文字の箇所を皆さんの環境に合わせてご変更ください。

ESXiが2台でクラスタ構成を組んでいる場合、どちらのESXiに対象の仮想マシンが存在するかはわからないため、ESXi 2台に対して、同じスクリプトを登録します。

No. IPアドレス プロトコル 条件 スクリプト
待機時間
スクリプトNo. スクリプト名称
1 ESXi #1のIP SSH シャットダウン 0 スクリプト20 Win10-shutdown
2 ESXi #2のIP SSH シャットダウン 0 スクリプト20 Win10-shutdown
3 ESXi #1のIP SSH シャットダウン 30 スクリプト21 WEBSV-shutdown
4 ESXi #2のIP SSH シャットダウン 30 スクリプト21 WEBSV-shutdown
5 ESXi #1のIP SSH シャットダウン 60 スクリプト22 DBSV-shutdown
6 ESXi #2のIP SSH シャットダウン 60 スクリプト22 DBSV-shutdown
7 ESXi #1のIP SSH シャットダウン 90 スクリプト23 VM-except-vCLS
8 ESXi #2のIP SSH シャットダウン 90 スクリプト23 VM-except-vCLS

いかがでしたでしょうか。
無事、vSphere環境の仮想マシンをシャットダウンできましたでしょうか。

本記事の通り対応してもシャットダウンができない場合は、以下ページからお問合せください。
https://socialsolution.omron.com/jp/ja/products_service/ups/virtualization/support_contact.html

また、お会いしましょう!