概要
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
にホスト名とネットワークをカスタマイズするためのスペックを設定します
今回はネットワークに関しては特に何も設定しないので情報は CustomizationGlobalIPSettings
と CustomizationAdapterMapping
はとりあえず作っているだけという感じです
ホスト名を変更するためには CustomizationLinuxPrep
を使います
:hostName
のフィールドに CustomizationFixedName
を使うことで VM 内のホスト名を変更することができます
動作確認
実行して VM が起動するとホスト名の部分が指定したものに変更されているのが確認できると思います
実際にコンソールや ssh で確認してもホスト名が変更されているのが確認できると思います
最後に
rbvmomi を使って CloneVM_Task のカスタマイズ機能を使ってみました
Hashicorp 社の terraform で使われている terraform-provider-vsphere などでこの機能は使われいるようです
また VM のカスタマイズは実際は perl スクリプト (Customize.pl ?) が実行されているようです
カスタマイズ後に削除されてしまうようですが中身がどんなものか実際に見てみていものです
0 件のコメント:
コメントを投稿