ピクトリンク事業部開発部インフラ課の「メガネとマスクを同時着用すると耳が痛くなる系エンジニア」の橋本です。この上さらにヘッドホンとか装備しようものなら、耳が爆発します。
本記事は フリューAdvent Calendar 2018 の12/12分です。
前回の記事で、ESXiサーバにパスワードなしで簡単にSSH接続できる環境を整えました。
今回はそれを活かしつつ、ESXi仮想環境をより便利にしていきます。
やりかた
いい感じに必要情報を取得するスクリプトを作成する
ESXiホストサーバでは、「そのホスト上で動作しているゲストサーバの概要を取得するコマンド」が用意されています。
$ vim-cmd vmsvc/getallvms Vmid Name File Guest OS Version Annotation 10 test-test-01 [datastore1] test-test-01/test-test-01.vmx centos7_64Guest vmx-13 13 test-test-02 [datastore1] test-test-02/test-test-02.vmx centos7_64Guest vmx-13 15 hoge-piyo-42 [datastore1] hoge-piyo-42/hoge-piyo-42.vmx centos64Guest vmx-08
しかし、これで取得できる情報は、登録されているゲストサーバ名とvmイメージのpath, イメージのバージョン情報くらいのもの。かなり限定的です。
個人的見解ですが、少なくともホストサーバの稼働状態(起動中・サスペンド中・停止中)は知りたい。
できれば、いつから稼働しているかとかの情報もわかると嬉しい。
そういう詳細情報まで取得したい場合、ESXiに用意されているget.summaryコマンドを使います。
vim-cmd vmsvc/get.summary 対象となるVMのID
これを叩くと、ずらずらっとjsonモドキの形式で情報が取れます。
出力結果は長いので省略しますが、割り当ててあるCPUのコア数であるとか、いろいろな情報が出ます。
ですが、ここで問題となるのが「対象となるVMのID」を指定しなければならない、というところ。
ホストの情報は1ホスト分ずつしか取得できず、しかもそのためにはVMのIDが必要なのです。(VMID自体は上記のgetallvmsで取得できる情報です)
なので、これらをいい感じに組み合わせるスクリプトを用意しました。
#! /bin/sh ## # usage: ESXサーバ上で叩いたら、そのESXホストサーバ上のゲストサーバのサマリを返します. ## RESULT="" # どのサーバで実行してるかを出力する echo `hostname` VMID_LIST=`vim-cmd vmsvc/getallvms | sed -n -e 's/ .*$//' -e '2,$p'` getvm() { # ホストごとに改行をいれたいのでデリミタに細工します IFS_BK=$IFS IFS= # 情報を絞り込む MACHINE=$(vim-cmd vmsvc/get.summary ${1} | grep "\(name = \|guestFullName\|powerState\|bootTime\|vmPathName\)") echo $MACHINE IFS=$IFS_BK } for vmid in ${VMID_LIST}; do # 並列実行する echo $(getvm ${vmid}) & done wait
シェバンが #! /bin/sh となっていますが、ESXiサーバで使えるのは /bin/bash ではなく/bin/sh です。
bashとは一部記法が違ったり、たとえば配列みたいな構造体が使えなかったりします。
$ chmod a+x ./get_vm_summaries.sh
実行権限付与をお忘れなきよう。
実行してみると、こんな感じの結果が帰ってきます。
[hashimoto@esx-test-01:~] ./get_vm_summaries.sh esx-test-01 powerState = "poweredOn", bootTime = "2018-11-18T04:58:19.842822Z", guestFullName = "CentOS 7 (64-bit)", name = "test-test-01", vmPathName = "[datastore1] test-test-01/test-test-01.vmx", guestFullName = "CentOS 7 (64-bit)", powerState = "suspended", bootTime = "2018-11-18T04:58:19.842822Z", guestFullName = "CentOS 7 (64-bit)", name = "test-test-02", vmPathName = "[datastore1] test-test-02/test-test-02.vmx", guestFullName = "CentOS 7 (64-bit)", powerState = "poweredOn", bootTime = "2018-11-18T06:51:53.194032Z", guestFullName = "CentOS 6 (64-bit)", name = "hoge-piyo-42", vmPathName = "[datastore1] hoge-piyo-42/hoge-piyo-42vmx", guestFullName = "CentOS 6 (64-bit)",
grep "\(name = \|guestFullName\|powerState\|bootTime\|vmPathName\)"
この部分で取得する情報を絞っているので、たとえば「IPアドレス情報も取得したい!」という場合には
grep "\(name = \|guestFullName\|powerState\|bootTime\|vmPathName\|ipAddress\)"
といった具合に、取得したい項目を追加してやれば良い感じになります。
SSH越しにスクリプトを実行する
こんな感じに複数のESXiサーバから単一のストレージサーバ(仮にhoge_fuga_maxheartとします)をマウントし、そこにスクリプトを置いてやれば、どのサーバからも先ほどのスクリプトが叩けるようになります。
$ /vmfs/volumes/hoge_fuga_maxheart/get_vm_summaries.sh
ssh越しに複数サーバのスクリプトを叩くには、接続用の鍵ファイルを置いてある環境で下記のようにします。
$ for esxihost in esx-test-{01..05}; do ssh -o 'StrictHostKeyChecking no' ${esxihost} /vmfs/volumes/hoge_fuga_maxheart/get_vm_summaries.sh done
前回の記事でパスワードなしにSSH接続する環境が整っていれば、一発で全てのホストサーバの状態を取得できます。情報を取ってくるだけなら、このコマンドを都度叩くだけで解決です。
あとはイイカンジのGUIのガワを作って、URLにアクセスがあるたびに情報を取ってきてやれば、見た目にも優しい状態確認画面の完成です。