Contents
vCenter 7.0からデベロッパー センター(Developer Center)でPowerCLI以外のコードが生成できる機能が追加されていることが確認できたので、ちょっと触ってみました。
デベロッパー センターで出来ること
- API Explorer
- vCenterのREST API仕様を確認および実行できる
- コードのキャプチャ
- Web Clientで操作した手順を記録しコード化(PowerCLI、vRO Javascript、Python、Go)してくれる
今回は コードのキャプチャ
を使って生成したPythonコードを実行してみます。
環境
項目 | バージョン | 備考 |
---|---|---|
vCenter | 7.0.0.10100 | |
CentOS | 7.5.1804 (Core) | コード実行環境 |
Python | 3.6.8 | コード実行環境 |
開発環境の準備
今回はPythonの開発環境を準備します。
まず、virtualenv環境を作成して有効化します。
1 2 3 4 |
# python3 -m venv venv # . venv/bin/activate (venv) # |
次にPythonコードの実行に必要な pyvmomi をインストールします。
1 2 3 4 5 6 |
(venv) # pip install pyvmomi Collecting pyvmomi (snip) Installing collected packages: six, urllib3, certifi, chardet, idna, requests, pyvmomi Successfully installed certifi-2019.11.28 chardet-3.0.4 idna-2.9 pyvmomi-6.7.3 requests-2.23.0 six-1.14.0 urllib3-1.25.8 |
これで実行環境は整いました。
コードの生成
コードの生成を有効にするには デベロッパー センター
をクリックし コードのキャプチャ
タブを選択し コードキャプチャを有効にする
を有効にします。
フォルダーを作成する例
簡単な例としてVMのフォルダーを作成してみます。
次のようにフォルダーを作成するコードを生成します。
次のコードが生成されたことが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#----------------- Start of code capture ----------------- from pyVmomi import vim #---------------getVmFolder--------------- managedObject.getVmFolder() # Datacenter-datacenter-3 #---------------CreateFolder--------------- name = 'test' managedObject.CreateFolder(name) # Folder-group-v4 #----------------- End of code capture ----------------- |
上から順番に見ると
- 必要なライブラリを読み込んで
- 管理オブジェクト(Managed Object)から対象のフォルダオブジェクトを取得して
- フォルダーを作成するメソッドを実行している
というのが分かります。
ただ getVmFolder()
というメソッドは APIリファレンス を見ても存在しません。
データセンターの管理オブジェクトからVMのrootフォルダーオブジェクトを取得しているので実際は vmFolder プロパティを使用するものだと思います。
(それか、自分が勘違いしてる可能性も…?でもドキュメントにないし実行してもエラーになるし…実際のオブジェクトの中身見ても無いし…getVmFolderってPowerCLIだったような記憶が…)
コード例
生成したコードは ログイン後
のコードしか生成しません。
そのため、生成されたコードを動かす場合はログイン・ログアウト処理をコードに追加する必要があります。
以下が、生成されたコードにログイン・ログアウトを追加した例になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/usr/bin/env python from pyVim.connect import SmartConnect, Disconnect from pyVmomi import vim import ssl import atexit host = '' username = 'administrator@vsphere.local' password = '' mob = vim.Datacenter if __name__ == "__main__": context = None if hasattr(ssl, '_create_unverified_context'): context = ssl._create_unverified_context() si = SmartConnect(host=host, user=username, pwd=password, sslContext=context) atexit.register(Disconnect, si) content = si.content mob_list = content.viewManager.CreateContainerView(content.rootFolder, [mob], True) for dc in mob_list.view: #---------------getVmFolder--------------- managedObject = dc.vmFolder # Datacenter-datacenter-3 #---------------CreateFolder--------------- name = 'test' managedObject.CreateFolder(name) # Folder-group-v4A |
パラメーター | 説明 |
---|---|
host | vCenterのホスト名 |
username | vCenterにログインするユーザー名 |
password | vCenterにログインするパスワード |
mob | 管理オブジェクト |
生成されたコードを見るとデータセンターの管理オブジェクトを元にVMフォルダーオブジェクトを取得しています。
そのため mob
には vim.Datacenter
を指定します。
その他の管理オブジェクトは Managed Object Types を確認してください。
今回は CreateContainerView を使ってデータセンター一覧を取得しています。
一つしかないので for の中は条件を入れていません。
複数ある場合の簡単な条件を入れるとすればデータセンター名が一致したら処理をするようなif文を追加する感じでしょうか。
1 2 3 4 5 |
(snip) for dc in mob_list.view: if dc.name == 'dc name': (snip) |
コード実行例
それでは、コードを実行してみます。
出来ました 🙂
その他について
例えば、VMを作成した時に生成されるコードは以下のようになります。
めちゃくちゃ長いですが、やってる事は一緒でデータオブジェクトのプロパティに必要なパラメーターを入れてメソッドを実行しているだけです。
VMを作成する CreateVM_Taskメソッドについてはここを見てください
最後に
今回はイメージを知ってもらうために簡単なフォルダー作成例を紹介しました。
今までは文字のみのドキュメントを見ながらやらなくちゃいけなかったので最初のとっかかりは結構ハードルがあったかもしれませんが、UIで操作した内容をコード化してくれるためコードのイメージが分かるので学習コストは下がるんじゃないでしょうか 🙂
(生成されるコードに若干微妙な点がありますが、将来修正されるでしょう)
これで、AnsibleのVMwareモジュールにもコントリビュートしてもらえる人が増える事を期待 🙂