FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

ESXiサーバ上で動作しているゲストサーバの詳細情報一覧を取得したい

ピクトリンク事業部開発部インフラ課の「メガネとマスクを同時着用すると耳が痛くなる系エンジニア」の橋本です。この上さらにヘッドホンとか装備しようものなら、耳が爆発します。

 

本記事は フリューAdvent Calendar 2018 の12/12分です。

 

前回の記事で、ESXiサーバにパスワードなしで簡単にSSH接続できる環境を整えました。

今回はそれを活かしつつ、ESXi仮想環境をより便利にしていきます。

やりかた

  1. いい感じに必要情報を取得するスクリプトを作成する
  2. SSH越しにスクリプトを実行する

いい感じに必要情報を取得するスクリプトを作成する

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)",

スクリプト21行目のgrep以降、

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にアクセスがあるたびに情報を取ってきてやれば、見た目にも優しい状態確認画面の完成です。