Upgrade to Pro — share decks privately, control downloads, hide ads and more …

pyvmomiで始めるvSphere_API生活_初級編_.pdf

 pyvmomiで始めるvSphere_API生活_初級編_.pdf

sky_joker

July 05, 2019
Tweet

More Decks by sky_joker

Other Decks in Technology

Transcript

  1. pyvmomiで始める
    vSphere API生活
    (初級編)
    @sky_jokerxx

    View Slide

  2. 今日話すこと
    • vSphere APIをこれから触ろうとしている人、触り
    始めた人向けの内容
    • pyVmomiやManaged Objectの簡単な説明
    • オブジェクト構造のツラミ
    • 便利かもしれないツール(自作)
    1

    View Slide

  3. pyvmomiとは
    2
    pyVmomiは、VMware vSphere API用のPython SDKです。
    このSDKを使用することで、ESXiやvCenterをプログラミングで管理・操作す
    ることができます。
    pyVmomiは過去4つのバージョンの下位互換をサポートしています。
    https://github.com/vmware/pyvmomi
    pyvmomi(GitHub)
    https://code.vmware.com/apis/358/vsphere
    vSphere API Reference

    View Slide

  4. pyvmomiインストール方法(簡単)
    3
    Pyvmomiインストール(venv)
    [pyvmomi@localhost ~]$ virtualenv venv # python2の場合
    [pyvmomi@localhost ~]$ python3 -m venv venv # python3の場合
    [pyvmomi@localhost ~]$ source venv/bin/activate
    (venv) [pyvmomi@localhost ~]$ pip install pyvmomi # 最新版を新ストールする場合
    (venv) [pyvmomi@localhost ~]$ pip install pyvmomi==6.7.0.2018.9 # バージョンを指定する場合
    pyVmomiのインストールはpip一撃なので簡単!
    Perl SDKを使っていた時はcpanで多くのモジュールをインストールしたり、libwww-pe
    rlのバージョン依存で苦しんでいた…

    View Slide

  5. pyvmomiの使い方例
    4
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from pyVim.connect import SmartConnectNoSSL, Disconnect
    from pyVmomi import vim
    import ssl
    import atexit
    if __name__ == "__main__":
    # ServiceInstanceを取得
    si = SmartConnectNoSSL(host="vCenter or ESXi IP or HostName",
    user="login user name",
    pwd="login password")
    # 処理完了時にvCenterから切断
    atexit.register(Disconnect, si)
    # ServiceContent(Data Object)を取得
    content = si.content
    # VMオブジェクトのリストを取得
    vm_objects = content.viewManager.CreateContainerView(
    content.rootFolder,
    [vim.VirtualMachine],
    True)
    # VM名を指定してオブジェクトを選択
    target_vm = ""
    for vm_obj in vm_objects.view:
    if vm_obj.name == "example":
    target_vm = vm_obj # target_vmにVMオブジェクトを格納
    break
    # target_vmが存在した場合、VM名を表示
    if target_vm:
    print target_vm.name
    VMのオブジェクト取得例

    View Slide

  6. Managed Objectの簡易概念図(イメージ)
    6
    Objectの概念図 (1) Managed Object
    データセンタ、ESXiホスト、仮想マシン、仮想スイッチなどの設定情報
    やプロパティ、メソッドがまとまったもの。
    基本、VMwareをプログラムなどから操作する場合は、Managed Obj
    ectの概念を理解しておく必要がある。
    Managed Objectを元にして設定変更やメソッドの実行(例えば、VM
    のPowerOn/Offなど)をする。
    (2) Data Object
    Managed Objectに関連する設定情報がまとまったデータ。
    Data ObjectはManaged Object内に複数存在する。
    例えば、NW設定情報やリソース設定情報は別々のData Objectで管
    理している。
    (3) Property
    オブジェクト内にある設定項目のようなイメージ。
    オブジェクトのプロパティを指定することで、そのプロパティの実際の
    値が取得できる。
    (4) Method
    言葉通り、方法や手法の関数というイメージ。
    例えば、仮想マシンのManaged Objectにあるシャットダウンメソッド
    を実行すると仮想マシンは停止する。
    Property Data Object 設定値
    仮想マシンのManaged Object
    name example
    config
    vim.vm.VirtualHardware
    hardeware
    numCPU 2
    MemoryMB 2048
    MOBの中は階層化
    されている
    Method
    MigrateVM_Task, MountToolsInstaller,
    PowerOffVM_Task, PowerOnVM_Task …
    など

    View Slide

  7. Objectの操作例
    6
    VMをシャットダウンする
    # target_vmをシャットダウンするメソッドを実行
    if target_vm:
    target_vm.ShutdownGuest()
    VMのCPU数を変更する
    # VM設定のデータオブジェクトを生成(CPUコアを2つにする)
    vm_config = vim.vm.ConfigSpec()
    vm_config.numCPUs = 2
    # target_vmの設定変更を実行
    If target_vm:
    target_vm.ReconfigVM_Task(vm_config)
    スナップショットを取得する
    # target_vmのスナップショットを作成
    if target_vm:
    target_vm.CreateSnapshot_Task(name="snapshot01",
    memory=False,
    quiesce=False)

    View Slide

  8. Managed Objectのつらみ
    7
    • (監視系を作っていた時)VMが数千台とかになってくると処理速度がやばたにえ

    • govmomi使って対処した
    • オブジェクトの中身が複雑すぎてやばたにえん
    • Managed Object Browserでオブジェクトの中身を確認しようとするとクリック数が
    やばたにえん
    • オブジェクトの中身を一覧表示するツールを作った(次へ続く)

    View Slide

  9. Managed Objectの中身一覧を表示するツール紹介
    8
    mob-peoperty-view
    Managed ObjectのPropertyやData Objectの一覧を再帰的に表示してくれるツール
    Python2/3で動作します
    https://github.com/sky-joker/mob-property-view
    mob-property-viewインストール
    (venv) [pyvmomi@localhost ~]$ git clone https://github.com/sky-joker/mob-property-view.git
    (venv) [pyvmomi@localhost ~]$ cd mob-property-view/
    (venv) [pyvmomi@localhost ~]$ pip install -r requirements.txt
    (venv) [pyvmomi@localhost mob-property-view]$ chmod +x mob-property-view.py

    View Slide

  10. mob-property-viewの使い方
    9
    example VMのオブジェクト一覧を表示
    (venv) [pyvmomi@localhost ~]$ ./mob-property-view.py -vc 192.168.0.111 --mob VirtualMachine -t example
    Password:
    -----------
    | example |
    -----------
    ------------------
    | availableField |
    ------------------
    (vim.CustomFieldsManager.FieldDef) []
    (snip)
    example VMのオブジェクトのnameプロパティを表示
    (venv) [pyvmomi@localhost ~]$ ./mob-property-view.py -vc 192.168.0.111 --mob VirtualMachine -t example --property name
    Password:
    -----------
    | example |
    -----------
    --------
    | name |
    --------
    example

    View Slide

  11. まとめ
    オブジェクトの慣れが必要
    vSphere APIのオブジェクトは複雑なため慣れが必要
    自動化できる!
    コードでインフラが制御できるようになれば自動化
    することが出来る!
    Ansibleモジュールが作れる!
    AnsibleのモジュールはpyVmomiベースで作られてい
    るのでオリジナルを作ったり、コミュニティにコン
    トリビュートすることができる!
    10

    View Slide

  12. https://twitter.com/sky_jokerxx
    https://qiita.com/sky_jokerxx
    https://sky-joker.tech
    https://github.com/sky-joker
    @sky_jokerxx
    Thank you For listening
    11

    View Slide