読者です 読者をやめる 読者になる 読者になる

停止中のvm(kvm)のネットワーク設定を書き換える習作

server perl

もう一年以上更新してなかったのか…

virt-cloneした後にネットワーク設定を修正するのが面倒くさいので、スクリプト一発でなんとかしたくて書いてみた。

#!/usr/bin/perl
use strict;
use warnings;
use Sys::Guestfs;
use Sys::Virt;
use Data::Section::Simple qw(get_data_section);

die "Usage: $0 domain ip_addr\n" if @ARGV != 2;
my ($domain, $ip) = @ARGV;

my $vmm_addr = 'qemu:///system';
my $vmm = Sys::Virt->new(address => $vmm_addr);

grep { $_->get_name eq $domain } $vmm->list_domains
    and die "$domain is now actvie.\n";

my ($dom_obj) = grep { $_->get_name eq $domain } $vmm->list_defined_domains
    or die "No sush domain: $domain\n";

my ($image, $mac) = $dom_obj->get_xml_description =~
    qr|
        <source[  ]file='(.*?)'/>
        .*
        <mac[ ]address='(.*?)'/>
    |sxm;


my $content = sprintf get_data_section('ifcfg-eth0'), $mac, $ip;

print <<EOT;
New network configuration
---------------------------
$content
---------------------------
EOT

my $guestfs = Sys::Guestfs->new;
$guestfs->add_drive($image);
$guestfs->launch;
$guestfs->mount( '/dev/mapper/VolGroup00-LogVol00', '/' );
$guestfs->write_file( '/etc/sysconfig/network-scripts/ifcfg-eth0', $content, 0 );
$guestfs->sync;

print "Finish\n";

__DATA__

@@ ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
HWADDR=%s
IPADDR=%s
NETMASK=255.255.255.0
ONBOOT=yes

CentOS5.5で動きます。他は知らない。

やってることは、

  1. domain(vm)が停止してるか確認
  2. domainのxml定義からイメージファイルのパスとMACアドレスと抜き出す。
  3. libguestfsを使って、停止中のvmの設定ファイルを引数で指定したIPと先程のMACで上書き。

vmのrootデバイスがハードコードなのがいけてないけど、guestfishのinspectみたいなのがSys::Guestfsに見当たらなかった。いい方法ないかな。

これだとNIC一個のvmしか対応してないし、本当にやりたいことはもうちょっと込み入ってるのであくまで習作。けどこれだけでも役に立つかもと思って一応晒しときます。