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 アドレスとホスト名の対応を記述したファイル。
使用方法
セットアップ
必要なモジュールをインストールする。
$ 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
まとめ
以上で、virt-clone 後の面倒な設定変更作業を自動化できた。今回はひとまず手元の環境で動くように書いたが、依然以下のような課題が残る。
- Ubuntu のみ対応
- /etc/network/interfaces のみ編集
- 複数の NIC には非対応
- 複数の仮想ディスクには非対応
このように適応範囲が限定的なので、追々直していきたい。というかいよいよ OpenStack を使うべきか。
GitHub への Pull Request も歓迎します。
P.S.
ここに来て気づいたが、virt-clone とくっつけるのは汎用性が低くなるので、複製は今まで通り手動 or シェルスクリプトでするとして、ゲストの設定変更に特化した方が良いかもしれない。