日本の vExpert 有志による Advent CalendarのイベントにvExpert一年生として今年から参加させていただきました。
この投稿は、vExperts Advent Calendar 2019 - Adventarの 2日目です。
2日目のブログでは、vSphereの管理をより便利にするためのAPI関連Tipを紹介します。
vSphereの管理インタフェースについて
まず最初にvSphereを管理するためにどんな管理インターフェースを使っているかのおさらいです。
とりあえず思い浮かんだものを列挙してみました
- vSphere Client (HTML5)
- vSphere WebClient (Flash)
- vSphere Client (C#)
- Host Client
- PowerCLI
- DCUI
- VAMI GUI (PSC/VCSA)
- Shell/SSH
- ESXi CGI (??? 正式名称をしらないです。。)
- MOB
- RVC
- vSphere API (Python/Java/RESTAPI 他)
まず最も基本であり、親しみがあるインターフェースはvSphere GUI (HTML5/Flash/C#) でしょう。
私自身はvmware サポート関係の仕事なので、実際のユーザがどのように管理しているのかはよく知らないのですが、おそらくDCUI/VAMI/SSHなどは、トラブルシューティング以外の場面では、ほとんど使われないのではないか、と想像してます。
vExpertになるような方々が多く愛用されているのは、おそらくPowerCLIなのではないか、と思います。vSphereのGUIにログインすることなく、vSphereへの命令や参照をスクリプト化することができ、GUIでの作業と比較して、正確さ、迅速さ、自動化、などの多大なメリットがあります。
一方で、それ以外のAPI (pythonやRESTAPI)などは、vSphereと連携する製品での実装は多くみられますが、実際に運用管理の場面で一から作成することは非常に少ないのではないか、と思います。今回はこれらのマイナーなAPIのなかでも、curlとwgetだけを使って利用できるもの(RESTAPI、MOB、ESXi CGI)に焦点を当ててご紹介したいと思います。
PowerCLIを使わない理由
私自身はPowerCLIをほぼ使いません。
PowerCLIを使うのはPowerCLIでしかできない作業をする場合のみです。(独立SSO vCenter間のvMotionなど)
PowerCLIを使わない理由は、一言でいえば私がvSphereサポートを生業にしているためです。
私の職場では、トラブルシューティングの際に、ログ解析だけでなく、実際にお客様環境にログインして事象を調査したり、ログを採取したり、といった作業があります。
そういった作業の際に、PowerCLIを使うことができたら非常に便利だなぁと思うのですが、いかんせんお客様環境のため、PowerCLIがインストールされているとは限りません。
PowerCLIどころか、FlashやJava(JRE)といった、GUI作業に必要なツールすらInstallされていないことが多々あります。
また、場合によってはWindows PCのようなDesktop端末が存在せず、LinuxベースのCUIのみの管理端末しかないことも多く存在します。
つまり先に列挙した例でいうと、
- vSphere Client (HTML5)>>> ブラウザがないので使えない
- vSphere WebClient (Flash) >>> ブラウザがあってもFlashがなくて使えない
- vSphere Client (C#) >>>> Install されてない
- Host Client >>>> ブラウザがないので使えない
- PowerCLI >>>> Install されてない
- DCUI >>>> アクセス手段がない
- VAMI GUI (PSC/VCSA) >>>> ブラウザが使えない
- Shell/SSH
- ESXi CGI (??? 正式名称をしらないです。。)
- MOB
- RVC
- vSphere API (Python/Java/RESTAPI 他)
つまり、メジャーどころの管理インターフェースのほとんどが利用できない環境で、障害対応をしなくてはなりません。
そのような非常に制限の厳しい状況下で調査やログ採取をするために利用要件の少ないAPIの活用が必要でした
なぜCurlとWget?
理由はシンプルです。この二つのコマンドはVCSAを含む多くのLinux端末にデフォルトで搭載されているからです。
そういった端末にSSHで接続さえできてしまえば、API経由で必要な情報を抽出できます。
利用要件はSSHに必要なネットワークアクセスと、認証情報と、Puttyの実行ファイルだけで済みます。
vSphere RESTAPIをつかってみよう
さて、前置きが長かったですがようやく本題です。まずはcurlコマンドで簡単に利用できるRESTAPIの使い方から紹介します。
私がRESTAPIを学び始めた当初は、比較的難しい開発向けの情報しか見つからず、RESTAPIでできる参照&命令の把握や、リクエスト方法のフォーマットや認証IDの取得方法がわからずとても苦労しました。
しかしながら現在は非常に便利なapi explorerというものがデフォルトで提供されています。
api explorerは一言で言ってしまえば、
「あなたの代わりにRESTAPIのcurlコマンドを作成してれるツール」
です。
どういうことなのか、さっそく見てみましょう。
API ExplorerにCurlコマンドを生成してもらう
api explorerにはvCSAにHTTPSでアクセスした際のランディングページの以下の場所から移動できます。
アクセスすると、操作対象によっていくつかAPIの選択肢が出ますが、vSphere関連の参照&命令がしたい場合はvcenterを選んでください。
vcenter API配下には、RESTAPIのパス毎に使用方法の説明などが記載されていますが、とりあえず例としてVMの一覧を取得してみましょう。
まずはpath名がVMのところを展開してください。そうするとメソッドがいくつか表示され、それぞれのメソッドの説明が見えるはずです。
その中で一番上のGET メソッド(仮想マシンの情報を表示する命令)をさらに展開すると具体的なRequest方法の説明が読めますが、
ここではとりあえず、一番下にある「TRY IT OUT!」のボタンを押してみましょう。(下図参照)
そうすると、実際にこのRESTAPIを実行するためのCurlコマンドとその実行結果を表示してくれます。
※API Explorerが生成するCurlコマンドにはデフォルトで-kが入ってませんので、証明書関連のエラーが想定される場合は-kを足してください。
ここで表示されるCurlコマンドをコピペして実行すれば、実際の環境でもそのまま使えるというわけです。めちゃめちゃ便利ですね。
しかし、ちょっと待ってください。実行結果をよく見ると、エラーになっています。
エラーの原因は"This method requires authentication."です。
当然ながら、vCenterから情報を抽出するためには認証が必要なので、認証情報を提供する必要がありました。
RESTAPIに必要な認証情報を取得する
結論から言うと、RESTAPIのリクエストヘッダに、session idを入れて送信する必要がありました。
セッションIDは以下のCurlコマンドで取得可能です。
curl -k -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'vmware-use-header-authn: test' --header 'vmware-api-session-id: null' -u 'administrator@vsphere.local' 'https://<vcenter ip>/rest/com/vmware/cis/session'
↑のコマンドを実行すると、administrator@vsphere.localのパスワードが求められますので、入力してあげると、以下のような感じでSession IDが返されます。
ここで得たSession IDを、最初に実行したCurlコマンドの vmware-api-session-id に入力してあげればOKです。具体的には以下のようになります。
↑のコマンドを実行すると対象vCenterで管理される仮想マシンの情報がJsonのフォーマットで入手できます。
以上が、vSphere REST APIの簡単なご紹介でした。
REST APIは比較的若い機能なのでまだまだできることが限られますが、使いやすいさやスクリプト化のしやすさもあるので今後も拡張されると思います。
なれない方には難しい点がまだあると思いますが、この記事とAPI Explorerを使えばだいぶ簡単にCurlコマンドまでは落とし込めるようになったのではないかと思います。
ESXi CGI ??? の使い方
ESXi CGIってなんやねん!?と思う方も多いと思いますが、私も正式な呼び名を知らないのでご容赦ください。
ようするに、https://<esxi ip>/host やhttps://<esxi ip>/folderでアクセスできる機能のことを勝手にそう呼んでいるだけです。
ESXiに対する直接の操作になりますので、vCenterが機能していない環境でも利用可能です。
この機能を利用すると以下のことが可能です。
- /folder にアクセスすることでデータストア上のファイルの閲覧とダウンロード
- /host にアクセスすることで、ESXiの主要なログファイルや構成ファイルを取得可能
- vm-supportを取得可能
/folderの使い方
特に説明の必要はないと思います。
https://<esxi ip>/folder にアクセスして、ログインも済ませればあとなLook & Feelで使えると思います。
ブラウザの右クリックから対象ファイルのURLも取得可能です。
/hostの使い方
/folderと同様に、/hostにアクセスすれば使えます。
限られたファイルしか閲覧できませんが、ESXiへのSSHが不要な点がメリットです。
Curlコマンドを使って簡単に対象のファイルを入手できます。
vm-supportの取得方法
以下のコマンドで入手可能です。
wget https://ip/cgi-bin/vm-support.cgi --user <> --password <> --no-check-certificate -O<output file name>
この方法は、https://kb.vmware.com/s/article/1967でも紹介されています。
vm-supportの取得方法はいくつかやり方がありますが、個人的にはこの方法が一番楽だと思います。
MOBの使い方
MOBはvCenterとESXiの両方に対して使える機能です。
vCenterはデフォルトで有効ですが、ESXi6.0以降のESXiではデフォルトで無効になっているので利用前に有効化する必要があります。
有効化の方法はこちらをご参考にしてください。(https://www.virtuallyghetto.com/2015/02/quick-tip-vsphere-mob-is-disabled-by-default-in-esxi-6-0.html)
こちらの使用方法もとても簡単です。URLに情報を取得したいmoidを指定してあげればOKです。
例えば以下のような形になります。
https://<esxi/vcenter ip>/mob/?moid=ha-host
自分がアクセスしたいオブジェクトのURLを知るためにはブラウザでアクセスするのが一番簡単です。
いちどvcenter/esxiのmobブラウザのホーム(/https://ip/mob)にアクセスしてブラウザからたどっていって、対象のオブジェクトを見つけたらその時のURLを記録するだけです。
このURLに対してcurlやwgetをしてあげればこのページの情報が入手できます。※ただしHTMLフォーマットになります。
今回紹介した方法の中では、mobから得られる情報が一番多いです。しかしながら出力がHTMLになってしまうという使いにくさと、メソッドを実行する際のちょっと特殊な方法をとる必要があるため、使用には難易度が高いです。
メソッドの実行に関して今回はご紹介はしませんが、もしご興味がある場合は私の過去のブログをご参考にしていただければと思います。
※ポイントとしては、MOBのURLにたいして 直接Curlを実行するだけではメソッドを実行することはできず、Mobブラウザに隠されているHidden 要素のSessionIDをPOSTしてあげる必要があります。
おわりに
今回の記事ではマイナーなAPIや管理インターフェースから情報やログファイルを入手する方法を紹介しました。
どれもこれもPowerCLIと比べると便利さや機能性に欠けますので、ユーザ目線ではあまり役に立たないかと思います。
しかしながら、Curlならではの良さもありますので、もしお役に立てそうな場面がありましたら是非とも活用してみてください。
あと、サポートの人たちはこんな感じで苦労しながら調査していることを少しでも思い出していただけたら、調査用の端末には十分な性能とアプリケーションをご準備いただけますと幸いです。
以上、vSphere APIのTipでした。
明日の vExperts Advent Calendar 2019 - Adventarは、interto さんです。よろしくお願いします。