概要
過去に紹介した記事に InstantClone 時に IP がバッティングしてしまうという問題があることを紹介しました
vmware-tools を使った解決方法がわかったので紹介します
環境
- VCSA 6.7.0.20000 build 10244745
- ESXi 6.7.0 Update 1 (Build 10302608)
- Ubuntu 18.04 LTS (クローン元)
クローン元の VM で準備
事前に作業が必要です
スクリプトを配置するだけです
ネットワーク情報を更新するスクリプトを準備
配置する場所はどこでも OK です
まだ実行しないでください
vim my_customize.sh
#!/bin/bash
vmware-rpctool "instantclone.freeze"
echo "Updating MAC Address ..."
for NETDEV in /sys/class/net/e*
do
DEVICE_LABEL=$(basename $(readlink -f "$NETDEV/device"))
DEVICE_DRIVER=$(basename $(readlink -f "$NETDEV/device/driver"))
echo $DEVICE_LABEL > /sys/bus/pci/drivers/$DEVICE_DRIVER/unbind
echo $DEVICE_LABEL > /sys/bus/pci/drivers/$DEVICE_DRIVER/bind
done
echo "Updating Hostname ..."
hostnamectl set-hostname ic01
chmod 755 my_customize.sh
やっていることは Mac アドレスの unbind/bind です
これを実行することでクローン元で使っていたイーサネットカードの Mac アドレスをリフレッシュして本来あるべき Mac アドレスを割り当てます
echo "0000:03:00.0" > /sys/bus/pci/drivers/vmxnet3/unbind
echo "0000:03:00.0" > /sys/bus/pci/drivers/vmxnet3/bind
ちなみに今回の環境は DHCP なのでこれを行うだけで dhclient が動作して DHCP サーバから IP の取得も行ってくれます
スナップショットを取得しておこう (optional)
この後で先程配置したスクリプトを実行します
スクリプトは一度実行すると VM が何も受け付けない状態になってしまいます
再起動すれば直りますが毎回再起動するのは面倒なのでスナップショットを取得しておきましょう
スクリプトを実行しておく
準備ができたらクローン元の VM でスクリプトを実行しておきましょう
./my_customize.sh
という感じでスクリプトを実行すると VM が何も受け付けない状態 (フリーズ) になります
スクリプト内に記述した vmware-rpctool "instantclone.freeze"
が実行されフリーズ状態になります
IP などもなくなるので SSH している場合には通信が切れます
ちなみにこうなると復帰させる方法はスナップショットから元に戻すか VM を再起動するしかありません
InstantClone を実行
フリーズ状態になったクローン元の VM を使って InstantClone を実行しましょう
API からのみ実行できるのできるので mob や rbvmomi を使いましょう (参考)
動作確認
InstantClone した VM で以下を確認しましょう
- IP アドレスがクローン元の VM と別のものが振られている
- ホスト名が設定されている
特に IP アドレスに関しては VM が起動してすぐに別の IP が振られていることを確認してみましょう
(Web Client から見るとクローン元の VM が振られているように見えますが実際は別の IP になっていると思います)
おまけ: guestinfo を組み合わせる
例えばホスト名などは動的に決めたい場合があります
そんな場合は InstantClone 時に guestinfo を設定することで実現することができます
またスクリプトも guestinfo から値を取得するように変更します
vim my_customize.sh
#!/bin/bash
vmware-rpctool "instantclone.freeze"
echo "Updating MAC Address ..."
for NETDEV in /sys/class/net/e*
do
DEVICE_LABEL=$(basename $(readlink -f "$NETDEV/device"))
DEVICE_DRIVER=$(basename $(readlink -f "$NETDEV/device/driver"))
echo $DEVICE_LABEL > /sys/bus/pci/drivers/$DEVICE_DRIVER/unbind
echo $DEVICE_LABEL > /sys/bus/pci/drivers/$DEVICE_DRIVER/bind
done
echo "Updating Hostname ..."
HOSTNAME=$(vmware-rpctool "info-get guestinfo.ic.hostname")
hostnamectl set-hostname ${HOSTNAME}
そして InstantClone を guestinfo 付きで実行します
vim instant_clone.rb
require 'rbvmomi'
vim = RbVmomi::VIM.connect(
host: '192.168.100.30',
user: 'administrator@vsphere.local',
password: 'xxxxxxxxxxx',
insecure: 'true',
rev: '6.7.1'
)
dc = vim.serviceInstance.find_datacenter('Datacenter') || fail('datacenter not found')
vm = dc.find_vm('u18_01') || fail('VM not found')
spec = {
name: "ic01", location: "",
config: [
{key: "guestinfo.ic.hostname", value: "ic01"}
]
}
ret = vm.InstantClone_Task(spec: spec).wait_for_completion
puts ret
こんな感じでホスト名を設定できます
ちなみに今回は DHCP 環境だったので Mac アドレスの更新だけで良かったのですが IP を static で振る場合には guestinfo を使って実現することもできます
static IP を振る場合はこちらのスクリプトが参考になると思います
最後に
InstantClone_Task
でクローン先の VM に同じ IP が振られてしまう現象に対応してみました
今回は Ubuntu18.04 に対するスクリプトなので別のディストリビューションや GuestOS であればそれ用のスクリプトを作成する必要があります
ちなみに InstantClone はクローン元の VM のコンソール情報もクローンします
なので InstantClone 前にコンソールでログインした状態にしてしまうとクローン後の VM もすでにコンソールでログインしている状態になってしまうので注意しましょう
0 件のコメント:
コメントを投稿