Help us understand the problem. What is going on with this article?

pyvmomiでVMのクローンをしてみる

More than 1 year has passed since last update.

pyvmomiを使ってVMwareのクローンを実行してみました。ここでは、簡単なコピーをするだけのスクリプトしかありません。
Windowsのsysprepを実行するような処理(カスタマイズ仕様)については、今度書こうと思います。

こういうスクリプトを作っておけば、ストレージの負荷検証ツール(クローン処理を同時に実行)などにも使えたりします :-)

実行環境

項目 バージョン
vCenter 6.5.0 ビルド 4602587
pyvmomi 6.5.0.2017.5.post1

検証方針

  • centos という仮想マシンを元に TEST という仮想マシンを作成する。
  • クローン先は esxi-03.local というホストを指定します。

ソース

#!/usr/bin/python3
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim, vmodl
import ssl
import atexit

# 接続先情報
host = 'ESXi or vCenter IP'
username = 'username'
password = 'password'

# クローン情報
clone_target_vm = 'クローン元VM名'
target_host = '展開先ESXiホスト名'
new_vm_name = '新しいVM名'

def get_mob_info(content, mob, target=''):
    """
    Management Objectを取得する。
    targetが指定されていない場合はContainerView(https://goo.gl/WXMfJK)で返す。

    :type content: vim.ServiceInstanceContent
    :param content: ServiceContent(https://goo.gl/oMtVFh)

    :type mob: Management Object
    :param mob: 取得する対象のManagement Objectを指定

    :type target: str
    :param target: 返すmobの名前を指定

    :rtype: Management Object
    :return: 指定したManagement Object又はContainerViewを返す
    """
    r = content.viewManager.CreateContainerView(content.rootFolder,
                                                [mob],
                                                True)

    # 返すmobを名前で指定する場合
    if(target):
        for i in r.view:
            if(i.name == target):
                r = i

    return r

def main():
    # SSL証明書対策
    context = None
    if hasattr(ssl, '_create_unverified_context'):
        context = ssl._create_unverified_context()

    # 接続
    si = SmartConnect(host = host,
                      user = username,
                      pwd = password,
                      sslContext = context)

    # 処理完了時にvCenterから切断
    atexit.register(Disconnect, si)

    # ServiceContent(Data Object)を取得
    content = si.content

    # RelocateSpecを作成 https://goo.gl/sJdBRH
    relocate_spec = vim.vm.RelocateSpec()
    relocate_spec.host = get_mob_info(content, vim.HostSystem, target_host)

    # CloneSpec作成 https://goo.gl/7ueuqR
    clone_spec = vim.vm.CloneSpec()
    clone_spec.location = relocate_spec
    clone_spec.powerOn = False
    clone_spec.template = False

    # Clone実行
    target_vm = get_mob_info(content, vim.VirtualMachine, clone_target_vm)
    target_vm.CloneVM_Task(folder = target_vm.parent, name = new_vm_name, spec = clone_spec)

if __name__ == '__main__':
    main()

各specの詳細については、ソースのURLで確認してください。

実行

(1) 変更必要な箇所を修正します。以下は、クローン情報の例です。

(snip)
# クローン情報
clone_target_vm = 'centos'
target_host = 'esxi-03.local'
new_vm_name = 'TEST'
(snip)

(2) 実行します。

[root@localhost pyvmomi]# ./vm_clone.py

(3) 仮想マシンが作成されたことを確認します。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away