2018年12月22日土曜日

InstantClone_Task 時に IP がバッティングしないようにする方法

概要

過去に紹介した記事に 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 件のコメント:

コメントを投稿