【VMware】vSphereのSDKを使って仮想マシーンを作成してみた
【目次】
- はじめに
- 実現したいこと
- 実現方法
- vCenterのAPIについて
- 実装方針
- VMware社提供のモジュール
- なぜPythonモジュールを使うのか?
- vCenterでのオブジェクト管理について
- 仮想マシーンを作成するAPI
- さいごに
はじめに
本記事では、仮想化ソフトウェアのVMware社が自社の製品を使った操作の自動化推進のために提供しているSDKを使って、VMインスタンスを作成する方法について解説します。
情報の正確さと網羅性を求めるのであれば、公式ドキュメントをみた方が確実です。
...しかし、英語で情報量も多いです。
膨大な英語のドキュメントなんて、なるべく読みたくない!
知りたいのはやりたいことができるかどうか?
やりたいことを日本語でまとめてくれている人はいないのか?
と藁にもすがる思いでググって、役に立つ個人ブログの記事を見つけたときテンションが上がりました。
そんなネットに恩返しがしたくて、久々にブログを書くことにしました。
実現したいこと
VMware ESXiのGUIを操作して作成していた仮想マシーン作成作業の自動化。
ただし、仮想マシーン作成後の初回起動時の設定(IPアドレスの設定など)は自動化の対象外。
実現方法
VMware社は、複数のVMwareESXiサーバーをまとめて管理できるようにvCenterというソフトウェアを提供しています。vCenterはAPIを提供しており、これを呼ぶことで仮想マシーン作成作業を自動化できます。
事前準備として、vCenter用のサーバーを別途用意して、VMwareESXiサーバーを関連づけておく必要があります。(設定方法は省略)
vCenterのAPIについて
vCenterが提供するAPIにはSOAP形式とREST形式の2種類あります。
REST形式は、URLにリソースパスを記載し、GETで設定取得/POSTで設定追加を行うWebAPIの実装方式です。
対してSOAP(ソープ)形式は一昔前に流行ったAPIの提供方式で、独自のXML形式のデータをやりとりして設定取得/追加を行うWebAPIの実装方式です。
SOAP形式と比較してREST形式の方がHTTPに寄せているので、直感的に分かりやすくかつHTTPリクエストを投げているだけなので、開発言語に依存しない実装が可能です。
私としてはREST形式のみで完結したいところですが、現時点だとSOAP形式の方が機能面で優れており、REST形式だと実現できない機能(※1)が多いです。
私が調べた中だと、作成した仮想マシーンと仮想スイッチを接続するための仮想ケーブル(ポートグループ)を追加したり詳細情報を取得する機能はSOAP形式でしか提供されていませんでした。
実装方針
開発言語:Python
開発方針:基本REST形式で、どうしても実現できない機能だけはSOAP形式を使用する。
その他:REST形式のWebAPIの動作検証用にPostman(GUI操作でWebAPIを実行できるツール)を使用する
VMware社提供のモジュール
今回はPythonとPostmanを使って開発するため、次の3つを落としてきます。
https://github.com/vmware/vsphere-automation-sdk-rest
→REST形式のAPIをPostmanから実行するための設定ファイルが置いてある。
ドキュメントは以下参照。
http://vmware.github.io/vsphere-automation-sdk-rest/6.7.1/index.html
なぜPythonモジュールを使うのか?
「SOAP形式のAPIってXML形式のデータをHTTPで投げているだけなら、モジュールの使い方を把握するより、自力で実装した方が楽じゃね?」
と疑問に思っていたのですが、よくよく考えると「XMLの記載方法を把握する方がしんどい」ことに後で気づきました。
また、モジュールはvCenterで管理しているリソースを階層構造でいい感じに表現しており、実行できる環境があればデバッグ機能を使って、ログイン→階層構造で整理されたvCenterのリソース取得→ブレイクで処理中断→デバッグコンソールで取得したリソースを漁って、それっぽい処理を見つける。という風にモジュールのドキュメントを読まなくても、お手軽に試行錯誤できるため意外と簡単に使えました。
例として、「ポートグループを追加するサンプルソースから、ポートグループの詳細情報を取得する方法を調べた時の実施方法」について説明します。
サンプルソース:https://github.com/vmware/pyvmomi-community-samples/blob/master/samples/add_portgroup_to_vswitch.py
main()を抜粋しコメント追加:
# サンプルソース: def main(): # 引数取得 args = get_args() # ログイン処理 if args.skip_verification: serviceInstance = SmartConnectNoSSL(host=args.host, user=args.user, pwd=args.password, port=443) else: serviceInstance = SmartConnect(host=args.host, user=args.user, pwd=args.password, port=443) # 処理終了時にのログアウト処理が呼ばれるようにする atexit.register(Disconnect, serviceInstance) # vCenterにひもづく全てのVMwareESXiの情報を取得 content = serviceInstance.RetrieveContent() # regex_esxiと同じ名前のVMwareESXiの情報だけを取得する。 hosts = GetVMHosts(content, args.regex_esxi) # ここにブレイクはって、デバッグコンソールでhostsの中身を見れば、 # いい感じに情報が取得できる(`・ω・´)キリッ # ポートグループ追加 AddHostsPortgroup(hosts, args.vswitch, args.portgroup, args.vlanid)
vCenterでのオブジェクト管理について
vCenterではホスト(VMwareESXiサーバー)、データストア、ネットワーク(ポートグループ)、リソース、仮想マシーンなどにIDを割り振って管理しており、vCenter経由で仮想マシーンを作成する際はIDを指定する必要があります。
既存のオブジェクトの名前からIDを取得するAPIは全てREST形式で実現でき、詳細について後述します。
-
vCenterに接続されているホスト(VMwareESXiサーバー)のオブジェクトIDの一覧を取得するAPI。
クエリパラメータとして
?filter.names.1={ホスト名}
を指定すると、指定したホスト名のIDのみを取得できる。 -
リソースプールの一覧を取得するAPI。
ホストに作成する仮想マシーンが使用するリソース(CPU、メモリ、ストレージ)に制限を設けたい時に使用する機能。デフォルトではホスト一つにホストの物理リソースをフルで使用できるリソースプールが作成されているため、クエリパラメーターとして
filter.hosts.1={ホストID}
を指定することで、ホスト配下のリソースプールIDのみを取得することができる。 -
vCenterでは作成した仮想マシーンを分類するための概念としてフォルダーを用意しており、フォルダ一覧を取得するAPI。
-
各ホストに追加している、ポートグループ(仮想ケーブル)の一覧を取得するAPI。
仮想マシーンを作成するAPI
仮想マシーンの作成はREST形式のAPIで実現できます。
APIの使い方の詳細は以下リンクを参照ください。
APIの実行例でobj-103
と設定されている箇所には、vCenterが割り振ったオブジェクトIDを指定しています。
パラメーターは大量にありますが全て設定する必要はなく、デフォルトから変わるものだけ設定すれば良いです。
最低限の設定が必要なパラメーターを見つける一番簡単な方法は、手動作成した仮想マシーンの設定情報を参考にする方法です。
仮想マシーンの設定情報は、REST形式のAPIを次の手順で実行することで取得できます。
作成した仮想マシーンのID取得。
→仮想マシーンの一覧を取得するAPI。クエリパラメーターとして
filter.names.1={仮想マシーン名}
を指定することで、任意の仮想マシーンのIDのみを取得することができる。ID指定で仮想マシーンの詳細情報取得。
URLに仮想マシーンのIDを指定することで、作成済みの仮想マシーンの詳細情報を取得するAPI。
さいごに
今の案件に参画して半年。
CCNP取得者の巣窟でニッチなネットワーク製品のAPI調査&検証作業を行う日々に、ただでさえ低い自己肯定感が地に落ちていく状況でした。
そんな中、 縛りプレイから解き放たれたPC環境(Notシンクラ端末)でVMwareのAPIを調査&実装していた2週間はとても充実したものでした。