virt-clone 後の処理を libguestfs で自動化する

virt-clone を使えば簡単に仮想マシンをコピーすることができる。しかしながら複製したマシンをネットワークに接続する場合、IP アドレスなどの設定を書き換える必要がある。単純作業だが、数が多くなると手間もばかにならないので、自動化を試みる。

アイディア

今回のアイディアとしては、libguestfs という VM のディスクイメージを操作するライブラリを使用して、複製したディスクイメージをホストにマウントし、ゲストのファイルシステムにアクセスして設定を直接書き換える。ついでにディスクのファイル名を自動生成する機能も付ける。

言語は Python を使う。guestfs モジュールの使い方は以下で確認できる。

$ python
>>> import guestfs
>>> help(guestfs)

対応 OS と必要な作業

OS ごとに主に以下のファイルの書き換えが必要となる。

Debian

/etc/network/interfaces

ネットワークインターフェイスの設定ファイル。IP アドレスを書き換える。

中身の例:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 172.16.0.10
        netmask 255.255.255.0
        network 172.16.0.0
        broadcast 172.16.0.255
        gateway 172.16.0.1
        dns-nameservers 172.16.0.1
        dns-search example.com

今回の場合 "address" の行を書き換えれば良い。

/etc/hostname

ホスト名の設定ファイル。

/etc/hosts

IP アドレスとホスト名の対応を記述したファイル。

Red Hat

/etc/sysconfig/network-scripts/ifcfg-eth*

ネットワークインターフェイスの設定ファイル。IP アドレスを書き換える。

/etc/udev/rules.d/70-presistent-net.rules

ネットワークインターフェイスのデバイス名と MAC アドレスが書かれたファイル。空にするか、NIC が複数ある場合は書き換える必要がある。

/etc/sysconfig/network

ホスト名などの設定ファイル。

/etc/hosts

IP アドレスとホスト名の対応を記述したファイル。

作成したスクリプト

スクリプトは Python で作成し、GitHub で公開しておいた。

使用方法

セットアップ

必要なモジュールをインストールする。

$ sudo apt-get install libguestfs0 libguestfs-tools python-guestfs
$ sudo update-guestfs-appliance

GitHub からソースを持ってくる

$ git clone https://github.com/akagisho/smartclone
$ cd smartclone
$ chmod +x smartclone.py

実行

$ sudo ./smartclone.py -i new_ipaddr src_domain dst_domain
  • new_ipaddr: 新しい IP アドレス
  • src_domain: クローン元の VM 名
  • dst_domain: クローン先の VM 名

なお Ubuntu 13.10 だと実行時に

Failed to connect to virtio-serial channel.

のようなエラーが出るが、libguestfs0_1.24.1-1_amd64.deb を入れることで解決した。

まとめ

以上で、virt-clone 後の面倒な設定変更作業を自動化できた。今回はひとまず手元の環境で動くように書いたが、依然以下のような課題が残る。

  • Ubuntu のみ対応
  • /etc/network/interfaces のみ編集
  • 複数の NIC には非対応
  • 複数の仮想ディスクには非対応

このように適応範囲が限定的なので、追々直していきたい。というかいよいよ OpenStack を使うべきか。

GitHub への Pull Request も歓迎します。

P.S.
ここに来て気づいたが、virt-clone とくっつけるのは汎用性が低くなるので、複製は今まで通り手動 or シェルスクリプトでするとして、ゲストの設定変更に特化した方が良いかもしれない。