この記事ではCurlコマンドのみを利用した、ESXiのSSHサービスの有効化方法を示します。

 

SSHの有効化がコマンド実行毎に必要となる環境の例

VMware環境を監視するために、Zabbixなどのアプリケーションを用いて、SSHコマンドを定期的にESXi上で実行したりしている環境はそれなりにあると思います。

SSHコマンドをRemoteから実行するためには、当然ながらESXiでSSHサービスが有効になっている必要があります。

多くの場合はSSHサービスを事前に有効化しておけば問題ないのですが、HCI製品などでSSHサービスの管理が明示的に行えない場合も時折あるかと思います。

たとえば、HCI製品固有の管理用VMがESXi Cluster全体のSSHサービスのOff/Onを動的に実施している場合などです。

 

そういった環境でZabbixなどの外部サーバから、SSHコマンドによる出力の監視を行いたい、と考えた場合、事前にSSHを有効化しておいたとしても、Systemが自動的にESXiのSSHサービスを無効化してしまい、監視用のコマンドが失敗する、といったことがあり得ます。

 

もちろんコマンドを実行する前にSSHサービスを都度有効化しさえすれば問題ないのです。

そういったことはPowerCLIやpyvmomiなどを使えば比較的簡単に実施できると思います。

しかしながら場合によってはLinuxで実行する必要があったり(PowerCLI使用不可)、Pythonなどのモジュールを自由に導入できない場合などもあるかと思います。

 

そういう要件の環境においてCurlコマンドでESXiのSSHを有効化できたら非常に便利かな?と思いましたのでCurlコマンドで実現する方法を紹介いたします。

この記事では結論部分のみを紹介しますが、答えにたどり着くまで(約1時間半)にもいろいろと勉強になることがありましたので、機会があれば紹介したいと思います。

 

 

実施手法

今回はMOB経由で実施する方法を選びました。

ちゃんと調べてませんが、もしかしたらVersionによってはRESTAPIで実施可能だったり、別のInterfaceからCurlコマンドのみ実施可能かもしれませんが、今回は筆者都合かつ広いVersionをカバーする意図でMOBを利用しました。もっと便利なやり方を知っている方がいたら教えていただきたいです。

 

 

試験環境

以下の環境で試しました。

・実行OS:SUSE Linux Enterprise Server 12 SP2

・curl  version :curl-7.37.0-37.34.1.x86_64

・ESXi Version :VMware ESXi 6.7.0 build-13644319

 

事前準備

対象となるESXi上でMOBが有効になっている必要があります。

ESXi上のMOBサービスはデフォルト無効になっているようです。(vSphere 6.0以降)

その場合は以下のサイトを参考にMOBを有効化しておいてください。

https://www.virtuallyghetto.com/2015/02/quick-tip-vsphere-mob-is-disabled-by-default-in-esxi-6-0.html

また対象となるESXiのIP、ユーザ名、パスワードが必要です。

 

有効化のコマンド

細かいことは抜きにして、以下で有効化可能でした。

 

# hostuser=<username>

# hostpass=<password>

# hostip=<ip address>

 

# SessionID=$(curl -s -k --user "$hostuser:$hostpass" --cookie-jar vc_cookie.txt  "https://$hostip/mob/?moid=serviceSystem&method=start"|awk -v FS="(vmware-session-nonce|value=\"|)" '/vmware-session-nonce/{print $3}' | cut -d"\"" -f1)

# curl -s -k  --cookie vc_cookie.txt  -X POST -d "vmware-session-nonce=$SessionID&id=TSM-SSH"  "https://$hostip/mob/?moid=serviceSystem&method=start" > /dev/null

 

直接サービス起動のMethodを実行することはできないため、一度対象のページにアクセスして、SessionID(vmware-session-nonce)を取得したうえで、そのSessionIDと起動したいサービス名をPOSTしてあげることで可能になりました。

"vmware-session-nonce