2020年4月1日水曜日

rbvmomi を使って CloneVM_Task 時に VM をカスタマイズする方法

概要

VM をクローンするときにカスタマイズ機能を使うと VM 内のホスト名や IP の固定化ができます
今回は rbvmomi を使って CloneVM_Task でホスト名をカスタマイズする方法を紹介します

環境

  • vSphere vCenter 6.5.0 9451637
  • CentOS 7.7.1908
  • Ruby 2.5.5p157
  • rbvmomi 2.3.1

とりあえず CloneVM_Task してみる

まずは普通に CloneVM_Task する方法を確認してみます
ちなみに今回、クローン元の VM は Ubuntu16.04 を使用しています

require 'rbvmomi'

vim = RbVmomi::VIM.connect(
  host: '192.168.100.10',
  user: 'administrator@vsphere.local',
  password: 'xxxxxxxxxxxx',
  insecure: 'true',
  rev: '6.7.1'
)

dc = vim.serviceInstance.find_datacenter('dc') || fail('datacenter not found')
vm = dc.find_vm('u16') || fail('VM not found')

# Create config spec and relocate spec
config_spec = RbVmomi::VIM.VirtualMachineConfigSpec(
  :annotation => 'vm clone'
)
relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec

# Create clone spec
spec = RbVmomi::VIM.VirtualMachineCloneSpec(
  :config => config_spec,
  :location => relocate_spec,
  :powerOn => false,
  :template => false
)

# Start clone vm
vm.CloneVM_Task(
  :folder => vm.parent,
  :name => 'clone',
  :spec => spec
).wait_for_completion

ポイント

CloneVM_Task する際には VirtualMachineCloneSpec というパラメータが必要になります
また VirtualMachineCloneSpec には更にいろいろな spec を設定することができそれによりクローンする VM のネットワークやストレージの構成、サマリ情報などを変更することができます
今回はとりあえず同じスペックの VM で名前が異なる VM をクローンします
クローン先は vm.parent を指定しておりこうすることでクローン元と同じディレクトリにクローンすることができます

カスタマイズを利用して CloneVM_Task 時に hostname を変更する

次に本題であるカスタマイズ機能を作ってみたいと思います

require 'rbvmomi'

vim = RbVmomi::VIM.connect(
  host: '192.168.100.10',
  user: 'administrator@vsphere.local',
  password: 'xxxxxxxxxxxx',
  insecure: 'true',
  rev: '6.7.1'
)

dc = vim.serviceInstance.find_datacenter('dc') || fail('datacenter not found')
vm = dc.find_vm('u16') || fail('VM not found')

config_spec = RbVmomi::VIM.VirtualMachineConfigSpec(
  :annotation => 'vm clone'
)
# Create nic spec
nic_setting = RbVmomi::VIM.CustomizationAdapterMapping(
  :adapter => RbVmomi::VIM.CustomizationIPSettings(
    :ip => RbVmomi::VIM.CustomizationDhcpIpGenerator
  )
)
# Create LinuxPrep
linux_prep = RbVmomi::VIM.CustomizationLinuxPrep(
  :domain => 'localdomain',
  :hostName => RbVmomi::VIM.CustomizationFixedName(
    :name => 'clone'
  )
)
# Create ip setting with nic spec and LinuxPrep
ip_settings = RbVmomi::VIM.CustomizationGlobalIPSettings
customization_spec = RbVmomi::VIM.CustomizationSpec(
  :globalIPSettings => ip_settings,
  :identity => linux_prep,
  :nicSettingMap => [nic_setting]
)
relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec

# Create clone spec customizing mode
spec = RbVmomi::VIM.VirtualMachineCloneSpec(
  :config => config_spec,
  :customization => customization_spec,
  :location => relocate_spec,
  :powerOn => true,
  :template => false
)

# Start clone
vm.CloneVM_Task(
  :folder => vm.parent,
  :name => 'clone',
  :spec => spec
).wait_for_completion

ポイント

VirtualMachineCloneSpec に先程設定しなかった :customization を設定します
:customization には CustomizationSpec を設定します
そして CustomizationSpec にホスト名とネットワークをカスタマイズするためのスペックを設定します
今回はネットワークに関しては特に何も設定しないので情報は CustomizationGlobalIPSettingsCustomizationAdapterMapping はとりあえず作っているだけという感じです
ホスト名を変更するためには CustomizationLinuxPrep を使います
:hostName のフィールドに CustomizationFixedName を使うことで VM 内のホスト名を変更することができます

動作確認

実行して VM が起動するとホスト名の部分が指定したものに変更されているのが確認できると思います
実際にコンソールや ssh で確認してもホスト名が変更されているのが確認できると思います

最後に

rbvmomi を使って CloneVM_Task のカスタマイズ機能を使ってみました
Hashicorp 社の terraform で使われている terraform-provider-vsphere などでこの機能は使われいるようです
また VM のカスタマイズは実際は perl スクリプト (Customize.pl ?) が実行されているようです
カスタマイズ後に削除されてしまうようですが中身がどんなものか実際に見てみていものです

参考サイト

0 件のコメント:

コメントを投稿