私が勤務しているオフィスの管理者は、バッテリー操作への無停電の切り替え時に、サーバーの自動シャットダウンを実行するタスクを設定しました。 一部のサーバーはWindows上で実行され(私も考えていませんでした)、esx / esxiで実行されました。これは、特にあらゆる種類のスクリプトを作成するnixの操作経験がほとんどないため、最も悩みました。 しかし、タスクは設定されており、それを解決する必要があります。
私はこの問題をゆっくりと研究し始めました。esxi5.x powerOffVmsのバイナリに移動すると、対応するオプションがオンになったときにゲストシステムをシャットダウンしました。 しかし、esxバージョンでそのようなことが見つからなかった場合、熱意は低下しました。 一般に、esxのbashにこの機能を実装することが決定されました(彼が何を求めているのか、そしてその理由を理解するためだけです)。
以下のすべてはさまざまな方法で実装できますが、より正確かもしれませんが、私は計画を投げたくありませんでした。
最初にしたことは、特定の仮想マシンをシャットダウンすることでした。 これを行うには、そのステータスと、これを行うesxコマンドを調べる必要がありました。 マニュアルに戻ると、我々には権利があります...
vim-cmd vmsvc / power.getstateマシン状態
vim-cmd vmsvc / power.shutdownシャットダウンゲストOS
vim-cmd vmsvc / power.off電源オフゲストOS
将来的には、スクリプトの実行中に、引き裂く可能性のあるマシンの名前の出力を明確にし、より正確にしたかった
vim-cmd vmsvc / get.summary
仮想マシンのIDを知っているため、わかりやすいようにその名前を取得して、ゲストOSをシャットダウンしようとします。 ただし、OSを正しくシャットダウンするには、インストールされたvmwareツールと「ゲストシャットダウン」プッシュが必要です。 そして、このすべてのビジネスは、マシンがオフになったかハングしたか、完了プロセスをチェックする時間をチェックすることです。 もう一度、マニュアルを吸って、vSphereクライアントを介して設定できるstopDelayなどを見つけます。デフォルトでは120秒です。 ここから破れます:
vim-cmd hostsvc / hostconfig
しかし、ここでも微妙な違いがありました。起動順序が設定されていないと、この遅延の値はそこにありません。
だから私たちは何を持っています...
車の名前を取得する
シャットダウン遅延値の配列を取得します。 包含順序が設定されていない場合、配列が完全ではない可能性があることを再度注意します。 次は、この問題を解決する方法に関する「松葉杖」です。
仮想マシンをシャットダウンします。 この関数は、シャットダウンプロセスが中断された場合に電源がオフになった後のマシンIDと遅延値を受け取ります。
計画には少なくともいくつかがありましたが、スクリプトの汎用性があるため、特定のマシンの電源を切ることはこの機能で形になりました...
ここで何をしているのか、GetStopOrder関数に仮想マシンを含める順序を取得します。この関数は、GetStopDelayの配列のインデックスに完全に対応するインデックスを持つ値の配列を返します。 そして、両方とも完全ではないかもしれません(私が上で示した理由)。 それからちょっとしたトリック、つまり松葉杖に行きます。 配列にないマシンの配列にデフォルトデータを追加します。 どのような種類のマシンがまったく設定されていないかを理解するには、最初に次のようにしてリスト全体を取得する必要がありました。
vim-cmd vmsvc / getallvms
そして、もしあれば、配列に欠損値を追加します...
さて、仮想マシンの起動順序を取得するまさに機能...
仮想マシンをオフにするか、GetVmStopDelay関数に戻りましょう。これは、使用する遅延の種類を決定します。 ここではすべてが簡単です。
出力では、特定の仮想マシンをオフにし、この全体をチェックします。フリーズが発生した場合、電源がオフになります(実際には、これはまだ行われていません)。
次に、ブート順序に従ってマシンをオフにするタスクを自分で設定しました。 もう考える必要はありませんでした。 キューの値を含む配列を取得し、それぞれを調べて、指定された方法でマシンの電源を切ります。
ここでは、車がたくさんある場合に注意を払う必要があります。シャットダウンプロセスには時間がかかる場合があります。 そして、バッテリーに切り替えるときが私たちのすべてです。 そのため、順序が重要でない場合にすべてのマシンをオフにする機能を作成することにしました。
前の機能とは対照的に、直接コマンド「vim-cmd vmsvc / power.shutdown」を使用して、マシンはチェックなしでオフになります。 しかし、マシンの1つのシャットダウンがハングした場合はどうでしょう。 作業の結果を確認する必要があります...ここで、別のControlVerboseShutDown関数が実装されます。これは、指定された期間の後、つまりマシンの状態を再確認します。 stopDelayに従って各仮想マシンに対して。 何も発明する必要はありません、すべてが書かれています-すべてが研究されています。
さて、パラメータを使用してスクリプト自体を呼び出す少し汎用性...
while getopts ":os:v" optname do case "$optname" in "o") OrderShutDown exit 1 ;; "s") VMID=$OPTARG SpecificVMShutDown "$VMID" exit 2 ;; "v") VerboseShutDown exit 3 ;; esac done
したがって、powerOffVms esxi 5.1のほぼ完全な類似物が得られました。 執筆の過程で、bashの基本、grepおよびsedユーティリティ、およびいわば正規表現を少し学びました。
もちろん、この問題は他の方法でも解決できます。
PowerCLIのPowerShellスクリプト
bashスクリプトを使用したvMA
pyshpere api
VIX API
しかし、私はそこで停止せずにesxi 5.1ですべてを起動しましたが、bashはありません(追加する必要がありました)。 あなたがもちろん興味があるなら、これはすべて次の記事で説明することができます。