<<  <  May  2008  >  >>
Su Mo Tu We Th Fr Sa
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

MooseX::ClassAttribute の挙動ってこれでいいの?

流行に乗って Punc にも Moose を取り入れようと思って、MooseX::ClassAttribute でクラス属性をハンドリングできるようにしてみたのですが、子クラスのクラス属性をセットすると、親クラスのクラス属性まで変わってしまう。

#!/usr/bin/perl

package Parent;
use Moose;
use MooseX::ClassAttribute;

class_has 'x' => ( is => 'rw' );

package Child;
use Moose;
extends 'Parent';

package main;

Parent->x('Parent');
warn Parent->x; # Parent が表示される

Child->x('Child');
warn Parent->x; # Child が表示されてしまう

これが一般的に望ましい動作なのかどうかわからないので、とりあえず Class::Data::Inheritable 使うように書き直した。


KLab 勉強会 #4 & Func & Punc

KLab 勉強会 #4 で、Func についてしゃべってきました。その時の様子は Ustream でご覧いただけます。また資料は後日 DSAS 開発者の部屋にアップされると思います。

スピーカのために壇上に水が用意されていることはよくあると思いますが、今回は僕のためにドクターペッパーが用意されているというスペシャルな待遇に感激しました。

で、Func についてしゃべった中で、いくつかいけてない点をあげたのですが、特に RedHat 系 Linux にしか対応してない、というところに不満もあり、また、モジュールを Perl で書きたいという思いもあり、じゃあ Perl で実装しちゃえ、ってことで、Punc - Perl Unified Network Controller なるものをつくりはじめました。

今のところプロトタイプでしかないため、まだまだ完成には程遠いですが、RedHat 系 Linux 上でサービスの起動状態を確認する、ということができるまでにはなっています。他の OS 用のモジュールを追加すれば、自動で判別して適切なモジュールを選択してくれる機能も実装しています。

YAPC::Asia 2008 でお話しする予定の システム管理フレームワークのアーキテクチャと Perl による実装 では、この Punc について詳しく解説する予定です。


Virt-Factory はもう古いらしい。時代は oVirt

Puppet Dojo で知り合った方から、Virt-Factory はもうアクティブじゃなくなって、今はoVirt という新しいプロジェクトに移ってる、ということをお聞きして、Virt-Factory のサイトに行ってみたら本当にそう書いてある!Xen が動かせるマシンが調達できたら、本格的に Virt-Factory 検証しよう、と思ってしばらくアクセスしてなかったら、いつの間にやらこんなことに…

つーわけで、Virt-Factory は捨てて oVirt の検証していくです。

Installing Instructions を見てみると、パッケージを配布してるわけじゃなく、QEMU/KVM の仮想マシンイメージとして配布されてる模様。まずはこのイメージを動かすところまでやってみる。

検証環境は CentOS 5 x86_64 です。手順は上記サイトの「Installing the management appliance」の通りではあるのですが、説明があまり親切ではないし、その通りではうまくいかないところもあったので、試してみたい方は、以下の手順も合わせて参考にしてみてください。。

まずは VM イメージを取得。場所はどこでもいいんですが、自分は ~/vm というディレクトリを作成して、その下に置いた。

$ mkdir ~/vm
$ cd ~/vm
$ wget http://ovirt.org/download/wui-appliance.dsk.bz2
$ bzip2 -d wui-appliance.dsk.bz2

次に必要なパッケージのインストール。

$ sudo yum install libvirt qemu kvm

以下のような ~/vm/wui-appliance.xml を作成。

<domain type="kvm">
  <name>wui-appliance</name>
  <memory>768000</memory>
  <currentMemory>768000</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type>hvm</type>
    <boot dev="hd"/>
  </os>
  <clock offset="utc"/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type="file">
      <source file="/home/miya/vm/wui-appliance.dsk"/>
      <target dev="hda"/>
    </disk>
    <interface type="bridge">
      <mac address="00:16:3e:08:97:e7"/>
      <source bridge="xenbr0"/>
    </interface>
    <input type="mouse" bus="ps2"/>
    <graphics type="vnc" port="-1" listen="0.0.0.0"/>
  </devices>
</domain>

libvirtd を起動して、virsh で qemu に接続、create でさきほどの XML ファイルを指定して VM 作成。

$ sudo /sbin/chkconfig libvirtd on
$ sudo /etc/init.d/libvirtd start
$ sudo virsh --connect qemu:///system  
virsh #  create wui-appliance.xml
Domain wui-appliance created from wui-appliance.xml
virsh # list
 Id Name                 State
----------------------------------
  1 wui-appliance        running

以上で VM 起動まで完了。で、VM に SSH とかでアクセスしたいんだけど、IP アドレスがわからない!(VM の IP アドレスを外から知る方法をご存知な方は教えてください。)というわけで、virt-manager からつないでみることにする。

$ sudo yum install virt-manager

virt-manager 入れたのはいいけど、CentOS は X 使えるようにしていないことに気づく。とりあえず手元の PC の cygwin に X が入ってたので、cygwin のシェルで

$ startxwin.sh
$ xhost +

でもって CentOS 上で

$ export DISPLAY=192.168.10.19:0.0
$ virt-manager

で virt-manager 起動。

Error: Macro Image(01.jpg) failed
Cannot reference local attachment from here

無事に画面が出たので、QEMU を選択して接続。

Error: Macro Image(02.jpg) failed
Cannot reference local attachment from here

VM が見えるので選択して、右下の「Open」をクリック。

Error: Macro Image(03.jpg) failed
Cannot reference local attachment from here

無事アクセスできた。root のパスワードは ovirtwui 。

ここまでやってから、XML で MAC アドレス指定してるんだから、DHCP サーバのログから IP アドレス調べればいいだけだった、ということに気づく。

今日はここまで。

Updated on 2008/03/04 01:20


Y コンビネータ を Perl で考えてみる

計算機科学を学んでいる人にとっては今更な話題らしいですが、経済学部出身の自分には目新しい話題なので書いてみます。(といっても、全然知らなかった、というわけでもないんですが。)

id:amachang さんのエントリにある最終形のみを Perl で書くとこんな感じかな。

my $Y = sub {
    my $f = shift;
    return sub {
        my $g = shift;
        return sub {
            my $m = shift;
            return $f->($g->($g))->($m);
        }
    }->(
        sub {
            my $g = shift;
            return sub {
                my $m = shift;
                return $f->($g->($g))->($m);
            };
        }
    )
};

my $fib = sub {
    my $f = shift;
    return sub {
        my $n = shift;
        return $n <= 2 ? 1 : $f->($n - 1) + $f->($n - 2);
    };
};

warn $Y->($fib)->(10);

なぜこれで再帰として動作するかを考えるにあたって、id:gotin さんのエントリと同内容のことを、Perl で考えてみる。

簡単にするために最終形の Y コンビネータになる前の中間形のコードで考える。

my $Y = sub {
    my $f = shift;
    my $g;
    return $g = sub {
        my $n = shift;
        $f->($g)->($n);
    }
};

my $fib = sub {
    my $f = shift;
    return sub {
        my $n = shift;
        return $n <= 2 ? 1 : $f->($n - 1) + $f->($n - 2);
    }
};

warn $Y->($fib)->(5);

$Y->($fib) は、 my $Y = sub { ... } において、$f に $fib が代入され、結果として以下の関数が返ることになる。

sub {
    my $n = shift;
    $fib->($g)->($n);
}

そうなると $Y->($fib)->(5) は、以下のように変換できる。

$fib->($g)->(5)

$fib->($g) は、my $fib = sub { ... } の $f に $g が代入されるので、$fib->($g)->(5) は、

sub {
   my $n = shift;
   return $n <= 2 ? 1 : $g->($n - 1) + $g->($n - 2);
}->(5);

ということになる。

なのでこの $n に 5 が代入され、結果として $fib->($g)->(5) は以下のように変換される。

  $g->(4) ... [A]
+ $g->(3) ... [B]

[A] を更に変換してみると、$g->(4) は $fib->($g)->(4) となり、

sub {
   my $n = shift;
   return $n <= 2 ? 1 : $g->($n - 1) + $g->($n - 2);
}->(4);

を実行するのと同じ。というわけで、$g->(4) は、

$g->(3) + $g->(2) ... [A]

になる。同様に [B] を変換すると、

$g->(2) + $g->(1) ... [B]

となる。今までのところまでをまとめると、$Y->($fib)->(5) は以下のように変換される。

  $g->(3) + $g->(2) ... [A]
+ $g->(2) + $g->(1) ... [B]

で、$g->(3) は [B] の変換と同様なので、更に以下のように変換される。

  $g->(2) + $g->(1) + $g->(2) ... [A]
+ $g->(2) + $g->(1)           ... [B]

ここで $g->(2) は、

sub {
   my $n = shift;
   return $n <= 2 ? 1 : $g->($n - 1) + $g->($n - 2);
}->(2);

であり、$n <= 2 であれば 1 が返る。ということは、$g->(2) も $g->(1) も 1 だから、[A] + [B] は以下のように変換される。

  1 + 1 + 1 ... [A]
+ 1 + 1     ... [B]

というわけで、結果は 5 になる。ということらしい。なんとなくわかった。


Virt-Factory クライアントをサーバへ登録する

前回に続き、今回はクライアント側の手順です。クライアント側では、必要なソフトウェアのインストールと、サーバへの登録を行います。

クライアントのサーバへの登録は、既に OS がインストールされた状態から行う方法と、OS がインストールされていないまっさらな状態から行う方法の2つがあります。

以下、2つの方法について手順を解説します。これもサーバと一緒で、Fedora 7 で試しています。

既に OS がインストールされた状態から行う方法

SELinux と iptables をオフに

とりあえず検証目的なので、こいつらはオフにしときます。手順は省略。

yum リポジトリの設定

これは サーバ側の設定 と同じなので省略。

必要なパッケージのインストール

Virt-Factory は仮想サーバの管理を行うためのものなので、当然何らかの仮想環境が必要。というわけで、Xen カーネルとツールをインストール。

$ sudo yum install kernel-xen xen

それから、Python をアップデートしないと、後述する virt-factory-node-server でエラーが出たので、アップデートしておく。

$ sudo yum update python

Xen カーネルで起動するために、再起動する。

現在の Virt-Factory は、Cobbler/Koan 0.6.2 を前提にしているため、バージョン指定で 0.6.2 をインストール。

$ sudo yum install koan-0.6.2-1.fc7

その他必要なパッケージをインストール。

$ sudo yum install virt-factory-nodes virt-factory-register libvirt-python

サーバへの登録

Virt-Factory クライアントをサーバに登録するためには、次のコマンドを実行します。

$ sudo vf_register --serverurl=http://server.example.org:5150 --profile=Container     

server.example.org の部分は、サーバ側で Python の socket.gethostname() で取得できるホスト名と同一である必要があります。(qpid でのメッセージング処理の関係で。)

登録が正常に完了すれば、サーバ側で ampm コマンドを実行して、確認することができます。(Web UI でも確認できます。)

$ sudo ampm list hosts
hostname: client.example.org id: 1 profile_name: Container::F-7-xen-i386 

最後に virt-factory-node-server を起動します。

$ sudo /sbin/chkconfig virt-factory-node-server on
$ sudo /etc/init.d/virt-factory-node-server start

OS がインストールされていない状態からの登録

OS がインストールされていない場合、PXE ブートからネットワークインストールを行い、その流れでサーバへの登録まで一気にやってしまいます。これは、前回の手順でインポートしたプロファイルの中で、これらの手順をすべてやるように指定されているので、特にこれ以上何かを設定する必要はありません。マシンを PXE ブートし、boot: プロンプトでプロファイル名 (Container::F-7-xen-i386)を入力すれば、あとは全て自動的に進んでいくはずです。(まだきちんと検証できてません。)

また、事前に Web UI で MAC アドレスを登録しておけば、boot: プロンプトにプロファイル名を入れる必要すらありません。

以上で、Virt-Factory クライアントのサーバへの登録は完了です。この後、ampm コマンドで、リモートの Virt-Factory クライアント上にコマンド一発でゲスト OS をインストールしたり、ゲスト OS の起動や停止をリモートから行ったり、複数のリモートクライアント上にあるゲスト OS をすべてリストアップしたり、といった、Virt-Factory のメインの使い方に入るわけですが、この解説はまた次回に。


Virt-Factory サーバのインストールと設定

前回紹介した Virt-Factory について、まずはサーバ側のインストールと設定手順を解説します。yappo さんと hirose31 さんに wktk されてしまったので、もう後には引けません。

おおまかな手順は 本家サイトのドキュメント の通りなのですが、ここの通りやってもうまくいかないので、試してみたい方は以下の手順を参考にしてください。

なお、本家から提供されているパッケージが Fedora 7 用のものしかないため、楽をするために Fedora 7 で検証しています。また、現時点での Virt-Factory のバージョンは 0.0.4 です。

SELinux と iptables をオフに

とりあえず検証目的なので、こいつらはオフにしときます。手順は省略。

yum リポジトリの設定

virt-factory.et.redhat.com のリポジトリを見に行くようにする。

$ sudo wget http://virt-factory.et.redhat.com/download/repo/virt-factory.repo --output-document=/etc/yum.repos.d/virt-factory.repo

virt-factory.repo の内容が間違ってるので、以下のように修正。

  • /etc/yum.repos.d/virt-factory.repo

    old new  
    11[virt-factory-fedora] 
    22name=Virt-factory packages 
    3 baseurl=http://virt-factory.et.redhat.com/download/repo/fc$releasever/stable/$arch
     3baseurl=http://virt-factory.et.redhat.com/download/repo/f$releasever/stable/i386
    44enabled=1 
    55gpgcheck=0 
    66 
    77[virt-factory-srpms] 
    88name=Virt-factory src packages 
    9 baseurl=http://virt-factory.et.redhat.com/download/repo/fc$releasever/stable/srpms 
     9baseurl=http://virt-factory.et.redhat.com/download/repo/f$releasever/stable/srpms 
    1010enabled=0 
    1111gpgcheck=0    

$arch の部分は Fedora 7 32bit だと i686 になってしまうが、リポジトリのディレクトリは i386 なので、修正が必要。64bit だと $arch 部分はそのままでいいかも。

必要なパッケージのインストール

普通に virt-factory-server パッケージを yum で入れると、依存関係で cobbler と koan が一緒にインストールされるのですが、updates にある cobbler 0.6.4 と koan 0.6.3 がインストールされてしまって、virt-factory-server が正常に動きません。なので、virt-factory.et.redhat.com にある 0.6.2 を明示的にインストールしてやります。

$ sudo yum install cobbler-0.6.2-1.fc7  koan-0.6.2-1.fc7

次に、Virt-Factory サーバ本体である virt-factory-server パッケージをインストールします。また、依存関係にはないものの、python-setuptools も必要なので一緒に入れておきます。

$ sudo yum install virt-factory-server python-setuptools

PostgreSQL の初期化

Virt-Factory はデータベースとして PostgreSQL を利用しています。(MySQL への対応予定もあるらしい。)以下のコマンドを実行して、Virt-Factory から PostgreSQL が利用できる状態にします。

$ sudo /etc/init.d/postgresql initdb    
$ sudo vf_fix_db_auth

デーモンの起動

Puppet を利用してるので、とりあえず Puppet サーバを起動しておきます。(が、この段階では起動しなくても問題ないです。)

$ sudo /sbin/chkconfig puppetmaster on 
$ sudo /etc/init.d/puppetmaster start

次に qpidd を起動します。これは必ず起動しておく必要があります。qpidd は、Virt-Factory のクライアント/サーバ間でのメッセージングのために利用されています。

$ sudo /sbin/chkconfig qpidd on
$ sudo /etc/init.d/qpidd start 

最後に virt-factory-server を起動します。

$ sudo /sbin/chkconfig virt-factory-server on
$ sudo /etc/init.d/virt-factory-server start

初回は起動時はデータベースとかテーブルを自動で作ってくれます。

vf_server import の実行

vf_server import により、以下の内容が実行されます。

  • /etc/virt-factory/settings の repos セクションに基づく yum リポジトリミラーの作成
  • /etc/virt-factory/settings の mirrors セクションに基づくディストリビューションミラーの作成
  • プロファイルの作成

ただし、プロファイルは cobbler import で作成されるものと一緒で、Virt-Factory に適したものではないため、捨ててしまって構いません。

まず、/etc/virt-factory/settings を2箇所いじります。mirrors のところは元は FC-7 になってるのですが、F-7 にしておく必要があります。

address は Virt-Factory サーバの IP アドレスを指定します。今回の import とは直接関係しませんが、どのみち変える必要があるので変えておきます。

mirrors:
    F-7: [ 'rsync://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/7/Fedora/i386/os/', '']
this_server:
    address: '192.168.25.134'

または、iso ファイルをダウンロードしてきて、

$ sudo mkdir /mnt/dvdiso
$ sudo mount -t iso9660 -o loop F-7-i386-DVD.iso /mnt/dvdiso

とマウントして、/etc/virt-factory/settings には

mirrors:
    F-7: [ '/mnt/dvdiso', '']

と設定してもいいです。検証で何度もやる場合には、iso イメージを持ってきておいた方が早いですね。

Virt-Factory でインストールするディストリビューションが Fedora 7 以外の場合には、repos セクションや mirrors セクションを適切に修正する必要があります。

設定ができたら、以下のコマンドを実行します。

$ sudo vf_server import

cobbler report で結果を確認できます。distro, repo, profile が登録されていることが確認できます。

$ sudo cobbler report
distro          : F-7-i386
kernel          : /var/www/cobbler/ks_mirror/F-7/images/pxeboot/vmlinuz
initrd          : /var/www/cobbler/ks_mirror/F-7/images/pxeboot/initrd.img
kernel options  : {}
architecture    : x86
ks metadata     : {'tree': 'http://@@server@@/cblr/links/F-7-i386'}
breed           : redhat

distro          : F-7-xen-i386
kernel          : /var/www/cobbler/ks_mirror/F-7/images/xen/vmlinuz
initrd          : /var/www/cobbler/ks_mirror/F-7/images/xen/initrd.img
kernel options  : {}
architecture    : x86
ks metadata     : {'tree': 'http://@@server@@/cblr/links/F-7-xen-i386'}
breed           : redhat

repo             : F-7-i386-core-lite
mirror           : http://download.fedora.redhat.com/pub/fedora/linux/releases/7/Everything/i386/os/
keep updated     : True
local filename   : F-7-i386-core-lite
rpm list         : ['m2crypto', 'python-simplejson']
createrepo_flags : -c cache

repo             : F-7-i386-updates-lite
mirror           : http://download.fedora.redhat.com/pub/fedora/linux/updates/7/i386/
keep updated     : True
local filename   : F-7-i386-updates-lite
rpm list         : ['cobbler', 'koan', 'python-cheetah', 'yum-utils', 'puppet',
'facter']
createrepo_flags : -c cache

repo             : F-7-i386-vf_repo
mirror           : http://virt-factory.et.redhat.com/download/repo/f7/stable/i386/
keep updated     : True
local filename   : F-7-i386-vf_repo
rpm list         :
createrepo_flags : -c cache

repo             : F-7-x86_64-core-lite
mirror           : http://download.fedora.redhat.com/pub/fedora/linux/releases/7/Everything/x86_64/os/
keep updated     : True
local filename   : F-7-x86_64-core-lite
rpm list         : ['m2crypto', 'python-simplejson']
createrepo_flags : -c cache

repo             : F-7-x86_64-vf_repo
mirror           : http://virt-factory.et.redhat.com/download/repo/f7/stable/x86_64/
keep updated     : True
local filename   : F-7-x86_64-vf_repo
rpm list         :
createrepo_flags : -c cache

profile         : F-7-i386
distro          : F-7-i386
kickstart       : /etc/cobbler/kickstart_fc6.ks
kernel options  : {}
ks metadata     : {}
virt file size  : 5
virt ram        : 512
virt type       : auto
virt path       :
repos           : []

profile         : F-7-xen-i386
distro          : F-7-xen-i386
kickstart       : /etc/cobbler/kickstart_fc6.ks
kernel options  : {}
ks metadata     : {}
virt file size  : 5
virt ram        : 512
virt type       : auto
virt path       :
repos           : [] 

サンプルプロファイルのインポート

virt-factory.et.redhat.com にサンプルプロファイルがあるので、こいつをインポートしてみます。

$ sudo rpm -Uvh http://virt-factory.et.redhat.com/download/profiles/vf-profile-Container-1-2.fc7.noarch.rpm
$ sudo rpm -Uvh http://virt-factory.et.redhat.com/download/profiles/vf-profile-Test1-1.234-2.fc7.noarch.rpm
$ sudo vf_import

cobbler report を実行すると、以下の4つのプロファイルが登録されていることが確認できます。

profile         : Container::F-7-i386
distro          : F-7-i386
kickstart       : /var/lib/virt-factory/kick-fc6.ks
kernel options  : {}
ks metadata     : {'server_name': '192.168.10.14', 'node_bare_packages': 'libvirt\npython-virtinst\nqemu\nkvm\n', 'cryptpw': '$1$mF86/UHC$WvcIcX2t6crBz2onWxyac.', 'server_param': '--server=http://192.168.10.14:5150', 'node_common_packages': 'koan\npuppet\nvirt-factory-nodes\nvirt-factory-register\nqemu\nkvm\n', 'network_param': '--allow-bridge-config', 'extra_post_magic': '/sbin/chkconfig 345 qemu on\n', 'node_virt_packages': '', 'token_param': '--profile=Container::F-7-i386'}
virt file size  : 0
virt ram        : 0
virt type       : qemu
virt path       :
repos           : ['F-7-i386-updates-lite', 'F-7-i386-core-lite', 'F-7-i386-vf_repo']

profile         : Container::F-7-xen-i386
distro          : F-7-xen-i386
kickstart       : /var/lib/virt-factory/kick-fc6.ks
kernel options  : {}
ks metadata     : {'server_name': '192.168.10.14', 'node_bare_packages': 'libvirt\npython-virtinst\nxend\n', 'cryptpw': '$1$mF86/UHC$WvcIcX2t6crBz2onWxyac.', 'server_param': '--server=http://192.168.10.14:5150', 'node_common_packages': 'koan\npuppet\nvirt-factory-nodes\nvirt-factory-register\nxen\nkernel-xen\n', 'network_param': '--allow-bridge-config', 'extra_post_magic': '', 'node_virt_packages': '', 'token_param': '--profile=Container::F-7-xen-i386'}
virt file size  : 0
virt ram        : 0
virt type       : xenpv
virt path       :
repos           : ['F-7-i386-updates-lite', 'F-7-i386-core-lite', 'F-7-i386-vf_repo'] 

profile         : Test1::F-7-i386
distro          : F-7-i386
kickstart       : /var/lib/virt-factory/kick-fc6.ks
kernel options  : {}
ks metadata     : {'server_name': '192.168.10.14', 'node_bare_packages': '', 'cryptpw': '$1$mF86/UHC$WvcIcX2t6crBz2onWxyac.', 'server_param': '--server=http://192.168.10.14:5150', 'node_common_packages': 'koan\npuppet\nvirt-factory-nodes\nvirt-factory-register\nqemu\nkvm\n', 'network_param': '', 'node_virt_packages': '', 'token_param': '--profile=Test1::F-7-i386'}
virt file size  : 5
virt ram        : 512
virt type       : qemu
virt path       :
repos           : ['F-7-i386-updates-lite', 'F-7-i386-core-lite', 'F-7-i386-vf_repo']

profile         : Test1::F-7-xen-i386
distro          : F-7-xen-i386
kickstart       : /var/lib/virt-factory/kick-fc6.ks
kernel options  : {}
ks metadata     : {'server_name': '192.168.10.14', 'node_bare_packages': '', 'cryptpw': '$1$mF86/UHC$WvcIcX2t6crBz2onWxyac.', 'server_param': '--server=http://192.168.10.14:5150', 'node_common_packages': 'koan\npuppet\nvirt-factory-nodes\nvirt-factory-register\nxen\nkernel-xen\n', 'network_param': '', 'node_virt_packages': '', 'token_param': '--profile=Test1::F-7-xen-i386'}
virt file size  : 5
virt ram        : 512
virt type       : xenpv
virt path       :
repos           : ['F-7-i386-updates-lite', 'F-7-i386-core-lite', 'F-7-i386-vf_repo']

cobbler import した時のプロファイルと違って、ks_metadata に koan, pupppet, virt-factory-nodes, virt-factory-register など、Virt-Factory クライアントとして必要なパッケージが含まれていたり、キックスタートファイル(/var/lib/virt-factory/kick-fc6.ks )の %post セクションで、Virt-Factory クライアントとして必要な処理が実行されています。

Web UI のインストール、設定、起動

virt-factory-wui パッケージをインストールするのですが、そのままインストールすると、rubygem-rails-2.0.1-1.fc7 がインストールされてしまい、動作しません。なので、明示的に rubygem-rails-1.2.3-1.fc7 をインストールします。

$ sudo yum install rubygem-rails-1.2.3-1.fc7

その後 virt-factory-wui パッケージをインストールします。

$ sudo yum install virt-factory-wui

デフォルトでは 127.0.0.1 でリッスンするようになっているので、他のマシンからアクセスする場合には、/etc/init.d/virt-factory-wui を書き換えます。

  • /etc/init.d/virt-factory-wui

    old new  
    1010VIRTFACTORY_DIR=/usr/share/virt-factory-wui 
    1111MONGREL_LOG=/var/log/virt-factory-wui/mongrel.log 
    1212MONGREL_PID=/var/run/virt-factory-wui/mongrel.pid 
    13 ADDR=127.0.0.1 
     13ADDR=0.0.0.0 
    1414RAILS_ENVIRONMENT=production 
    1515USER=virtfact 
    1616GROUP=virtfact 

起動します。

$ sudo /sbin/chkconfig virt-factory-wui on
$ sudo /etc/init.d/virt-factory-wui start  

css ファイルへのパスがおかしいので、/usr/share/virt-factory-wui/app/views/layouts/virt-factory-layout.rhtml を修正します。

  • /usr/share/virt-factory-wui/app/views/layouts/virt-factory-layout.rhtml

    old new  
    77     <!-- dynamically filled in page title --> 
    88     <title>virt-factory: <%= @page_title %></title> 
    99 
    10      <link rel="stylesheet" href="<%= ActionController::AbstractRequest.relative_url_root %>/style.css" type="text/css" /> 
     10     <link rel="stylesheet" href="/style.css" type="text/css" /> 
    1111 
    1212  </head> 

3000番 ポートにアクセスして、admin, fedora でログインします。

virt-factory-ampm のインストール

virt-factory-ampm は、Virt-Factory のコマンドラインクライアントで、リモートホスト上に仮想マシンを作成したり、仮想マシンの起動/停止を行ったり、といったことができます。

$ sudo yum install virt-factory-ampm 

このままだと ampm コマンドを実行する度に no config file found と言われてうざいので、空の .ampm_config を作成しておきます。

$ touch ~/.ampm_config

help を見ると、どんなことができるかがざっとわかります。

$ ampm --help
global options
         --help, -h
         --verbose, -v
         --server <server url>
         --username <username>
         --passowrd <password>
valid modes include:
         pause, create, list, start, add, shutdown, query, unpause, delete
pause:
        Pause a guest
        ampm pause guest_name [--guest_id] <guest_id>
create:
        Create a new guest
        --help, -h
        --verbose, -v
        --host <hostname>           the  host to run the guest on
        --profile <profilename>     the profile to create the guest with
list:
        List information about virt-factory
        valid sub modes are hosts, guests, status, profiles, tasks, users
                 hosts      list machines capabable of running guests
                 guests     list virtulized guests
                 status     list status of virtulized guests
                 profiles   list profiles available for creating guests or hosts
                 tasks      list tasks that are queued
                 users      list users
start:
        Start up a guest
        ampm start guest_name [--guest_id] <guest_id>
add:
         Add a new user to virt-factory
         --username <username>
         --password <password>
         --first <first_name
         --middle <middle_name>
         --last <last_name>
         --email <email address>
         --description <desription>
shutdown:
        Shutdown a guest
        ampm shutdown guest_name [--guest_id] <guest_id>
query:
        Query a guest for more info about what host or profile a guest is running
        --help, -h
        --verbose, -v
        --host <host>     which host a guest is running on
        --profile <profile>          which profile a guest is running
unpause:
        Unpause a guest
        ampm unpause guest_name [--guest_id] <guest_id>
delete:
        Delete a task, profile, or user
         --help, -h
         --verbose, -v
         --task_id <task_id>            delete a task from the task queue
         --user_id <user_id>            delete a user

次回はクライアント側のインストールと設定手順について解説予定です。解説アップしました

Updated on 2008/01/12 15:41


Virt-Factory

CobblerKoan について触れたところで、次は Virt-Factory です。

Yappo さんが Xen 環境で Cobbler/Koan が動くことを検証してくださったので、心置きなく Virt-Factory の紹介ができます。こちらの身勝手なお願いに応じてくれた Yappo さん、ありがとうございます。

Virt-Factory は、大量の仮想サーバの管理を楽に行うためのツールで、Cobbler/Koan + Puppet + これらをラップするサーバ/クライアントデーモンとコマンドラインツール + Web UI + XMLRPC API、といった感じです。具体的には、以下のような感じ。

  • Cobbler/Koan、Puppet の統合
    • Cobbler による PXE ブート + ネットワークインストール環境の構築。単に Cobbler を利用する場合とは違い、キックスタートファイルに、Virt-Factory に必要なパッケージのインストールや、インストール後に必要な処理の実行を含めてくれる。
    • Koan によるホスト OS や Xen/QEMU ゲスト OS のコマンド一発インストール。Koan を使う場合は、ホスト OS 上で実行する必要があるが、Virt-Factory を使うと中央のサーバからリモートで実行できる。
    • リモートのホスト OS 上にある仮想サーバの状況を、中央のサーバで一元管理できる。
    • Cobbler でのキックスタートファイル作成時に、Puppet パッケージのインストール処理を含めてくれたり、プロファイル属性として Puppet クラスを指定できたりとか。おそらく Puppet サーバのノード管理とも連携するんじゃないだろうか。(ここはまだちゃんと検証できてない。)
  • Web UI でプロファイルやシステムの登録、管理などができる
  • Web UI やコマンドラインツールは XMLRPC API と連携してる

とてもよさげなツールではあるのですが、色んなツールを統合してるだけあって、できることが多すぎてわけがわからないし、本家サイトのインストール/セットアップドキュメントの通りにやっても動かないし、ドキュメントも不十分で、これから触ってみようと思う方は苦労するかと思いますので、インストール手順から使い方まで、自分が理解できた範囲で、今後数回にわけてご紹介していこうと思います。

ただしプロダクトとしてはまだ発展途上という感じで、すぐに実践投入できるものではなさそうです。

とりあえず次回は Virt-Factory サーバのインストールと設定について解説予定です。解説をアップしました

Updated on 2008/01/05 20:17


Koan で Cobbler を更に便利に

Koan (Kickstart over a network) を使うと、Cobbler と連携して、PXE ブートを使わずに OS を再インストールしたり、Xen または QEMU のゲスト OS をコマンド一発でインストールすることができます。

以下、Fedora 7 で Koan を試してみたメモ。

Koan のインストール

$ sudo yum install koan

プロファイルやシステムの一覧を表示

プロファイル一覧を表示する。

$ sudo koan --server=cobbler.example.org --list-profile
fc7-i386
fc7-xen-i386 

システム一覧を表示する。

$ sudo koan --server=cobbler.example.org --list-system
test-server.example.org

cobbler.example.org は cobbler が動いてるサーバ。koan による OS インストールを行うときには、プロファイルかシステムのどちらかを指定する。

OS の再インストール

OS を再インストールする時には、--replace-self オプション と --profile または --system を指定して koan を実行。

$ sudo koan --server=cobbler.example.org --replace-self --profile=f7-i386
- using kickstart from cobbler: http://cobbler.example.org/cblr/kickstarts/f7-i386/ks.cfg
downloading initrd initrd.img to /boot/initrd.img
url=http://cobbler.example.org/cobbler/images/f7-i386/initrd.img
- using kickstart from cobbler: http://cobbler.example.org/cobbler/images/f7-i386/initrd.img
downloading kernel vmlinuz to /boot/vmlinuz
url=http://cobbler.example.org/cobbler/images/f7-i386/vmlinuz
- using kickstart from cobbler: http://cobbler.example.org/cobbler/images/f7-i386/vmlinuz
- kickstart: http://cobbler.example.org/cblr/kickstarts/f7-i386/ks.cfg
- downloading http://cobbler.example.org/cblr/kickstarts/f7-i386/ks.cfg
- using kickstart from cobbler: http://cobbler.example.org/cblr/kickstarts/f7-i386/ks.cfg
- ['/bin/bash', '/var/spool/koan/insert.sh']
cpio
14535 blocks
14538 blocks
done
- ['/sbin/grubby', '--grub', '--add-kernel', '/boot/vmlinuz', '--initrd', '/boot/initrd.img', '--make-default', '--title', 'kick1199098439', '--args', 'ksdevice=eth0 lang=  kssendmac syslog=cobbler.example.org:25150 text  ks=file:ks.cfg', '--copy-default']
- reboot to apply changes 

ネットワークインストール用の /boot/initrd.img とか /boot/vmlinuz とかを cobbler サーバからダウンロードして、/boot/grub/menu.lst を書き換えてくれる。

あとは再起動すれば、OS の再インストールが勝手にはじまる。

Xen ゲスト OS のインストール

Xen のインストールと Xen カーネルの起動

当然 Xen 環境が必要になるので、Xen をインストール。

$ sudo yum install kernel-xen xen

インストール後、/boot/grub/menu.lst を書き換えて、デフォルトで Xen カーネルが起動するようにして再起動する。

koan コマンドでの Xen ゲスト OS インストール

--replace-self ではなく --virt を指定する。

$ sudo koan --server=cobbler.example.org --virt --profile=f7-xen-i386

これで Xen ゲスト OS のインストールがはじまる、はずなんだけど、うちの環境では Segmentation Fault になってしまった。VMWare 上で Xen を動かすというのは無理があるのかもしれない。

実機で試したいところだけど、試せるサーバがないので保留。Yappo さんあたりが試してレポートしてくれるに違いない、きっと。


Cobbler Web UI

前回のエントリで書いた Cobbler にはウェブ UI がある。その設定方法のメモ。設定方法はここを参照した。Cobbler のバージョンが 0.7 以降の場合はこっちを参照

まずは /var/lib/cobbler/settings の xmlrpc_rw_enabled を 1 に設定。

xmlrpc_rw_enabled:  1

これを見て想像がつくと思うけど、cobblerd が XMLRPC リクエストを受け付けるようになる。

次に /etc/cobbler/auth.conf で、cobblerd の XMLRPC へのアクセスを許可するユーザ ID とパスワードを設定する。

[xmlrpc_service_users]
admin = password

/etc/cobbler/auth.conf が httpd ユーザから読めるようにする。

$ sudo chown apache /etc/cobbler/auth.conf

SELinux を利用している場合はこの設定も必要らしい。(自分は SELinux は disabled にしてる。)

$ sudo chcon -t httpd_sys_content_t /etc/cobbler/auth.conf
$ sudo setsebool httpd_can_network_connect true

httpd で認証するユーザ名とパスワードを設定する。これは /etc/cobbler/auth.conf で設定したものと同じにする。

$ sudo htdigest /var/www/cgi-bin/cobbler/.htpasswd "Cobbler WebUI Authentication" admin

あとは http://cobbler.example.org/cgi-bin/cobbler/webui.cgi にアクセスすれば OK。以下のスクリーンショットは Profile を表示させたところ。

Error: Macro Image(cobbler_web_ui.jpg) failed
Cannot reference local attachment from here

この画面見てて気づいたんだけど、Cobbler では system の登録ができて、MAC アドレスを登録して Profile を指定しておけば、PXE ブート時にイメージ名を入力しなくても、勝手に指定された Profile のイメージでブートしてくれる。

system の登録はコマンドラインでもできる。

$ sudo cobbler system add --name=test-server --mac=00:0C:29:7E:3A:8B --profile=f7-i386


Cobbler が素敵すぎる

ネットワークインストール環境がさくっと構築できる Cobbler がおもしろそうなので触ってみたメモ。参考にしたサイトは以下の通り。

以下、Fedora 7 で Cobbler を動かしてみたメモ。

インストール

yum で一発インストール。

$ sudo yum install cobbler

設定

cobbler check コマンドを実行すると、見直すべき設定ポイントを教えてくれる。親切。

$ sudo cobbler check
The following potential problems were detected:
#0: The 'server' field in /var/lib/cobbler/settings must be set to something other than localhost, or kickstarting features will not work.  This should be a resolvable hostname or IP for the boot server as reachable by all machines that will use it.
#1: For PXE to be functional, the 'next_server' field in /var/lib/cobbler/settings must be set to something other than 127.0.0.1, and should match the IP of the boot server on the PXE network.
#2: service cobblerd is not running
#3: syslinux should be installed but is not, expecting to find something at /usr/lib/syslinux/pxelinux.0
#4: service xinetd is not running
#5: change 'disable' to 'no' in /etc/xinetd.d/tftp
#6: service httpd is not running
#7: since iptables may be running, ensure 69, 80, 25150, and 25151 are unblocked#8: reposync is not installed, need for cobbler reposync, install/upgrade yum-utils?
#9: yumdownloader is not installed, needed for cobbler repo add with --rpm-list
parameter, install/upgrade yum-utils? 

これを元に設定変更を行っていく。まずは /var/lib/cobbler/settings を以下のように修正。

manage_dhcp: 1
next_server: '192.168.10.12'
server: 192.168.10.12

192.168.10.12 は Cobbler が動いているマシンの IP アドレス。

cobblerd を起動。

$ sudo /sbin/chkconfig cobblerd on 
$ sudo /etc/init.d/cobblerd start 

syslinux をインストール。

$ sudo yum install syslinux

tftpd と xinetd を起動。

$ sudo /sbin/chkconfig tftp on
$ sudo /sbin/chkconfig xinetd on 
$ sudo /etc/init.d/xinetd start 

httpd を起動。

$ sudo /sbin/chkconfig httpd on
$ sudo /etc/init.d/httpd start 

iptables はとりあえずオフにしとく。

$ sudo /sbin/chkconfig iptables off
$ sudo /etc/init.d/iptables stop 

yum-utils のインストール。

$ sudo yum install yum-utils

/etc/cobbler/dhcp.template を以下のような感じで修正。

# ******************************************************************
# Cobbler managed dhcpd.conf file
#
# generated from cobbler dhcp.conf template ($date)
#
# ******************************************************************

ddns-update-style interim;

allow booting;
allow bootp;

ignore client-updates;
set vendorclass = option vendor-class-identifier;

subnet 192.168.10.0 netmask 255.255.255.0 {
     option routers          192.168.10.1;
     option subnet-mask      255.255.255.0;
     range dynamic-bootp     192.168.10.100 192.168.10.254;
     filename                "/pxelinux.0";
     default-lease-time      21600;
     max-lease-time          43200;
     next-server             $next_server;
}

$insert_cobbler_system_definitions

dhcp をインストールしておく。dhcpd はこの段階では起動しなくていい。(起動してもエラーになる。)

$ sudo yum install dhcp
$ sudo /sbin/chkconfig dhcpd on

ネットワークインストールに必要なファイルの用意

インストールイメージとか、キックスタートファイルとかを作成。

$ sudo cobbler import --path=rsync://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/7/Fedora/i386/os --name=f7

このコマンド一発で必要なものを全部つくってくれる。超簡単。時間はかかるけど。

cobbler report を実行すると、どこにどんなファイルがあるかとかを表示してくれる。

$ sudo cobbler report
distro          : f7-i386
kernel          : /var/www/cobbler/ks_mirror/f7/images/pxeboot/vmlinuz
initrd          : /var/www/cobbler/ks_mirror/f7/images/pxeboot/initrd.img
kernel options  : {}
architecture    : x86
ks metadata     : {'tree': 'http://@@server@@/cblr/links/f7-i386'}
breed           : redhat

distro          : f7-xen-i386
kernel          : /var/www/cobbler/ks_mirror/f7/images/xen/vmlinuz
initrd          : /var/www/cobbler/ks_mirror/f7/images/xen/initrd.img
kernel options  : {}
architecture    : x86
ks metadata     : {'tree': 'http://@@server@@/cblr/links/f7-xen-i386'}
breed           : redhat

profile         : f7-i386
distro          : f7-i386
kickstart       : /etc/cobbler/kickstart_fc6.ks
kernel options  : {}
ks metadata     : {}
virt file size  : 5
virt ram        : 512
virt type       : auto
virt path       :
virt bridge     : xenbr0
virt cpus       : 1
repos           : []
dhcp tag        : default
server          : <<inherit>>

profile         : f7-xen-i386
distro          : f7-xen-i386
kickstart       : /etc/cobbler/kickstart_fc6.ks
kernel options  : {}
ks metadata     : {}
virt file size  : 5
virt ram        : 512
virt type       : auto
virt path       :
virt bridge     : xenbr0
virt cpus       : 1
repos           : []
dhcp tag        : default
server          : <<inherit>>

これを見て分かるとおり、Xen 用のイメージなんかも勝手に作ってくれる。

あとは必要に応じてキックスタートファイル(/etc/cobbler/kickstart_fc6.ks)なんかをいじる。何かファイルを修正したりしたら、cobbler sync を忘れずに実行。

$ sudo cobbler sync

ネットワークインストールを実行する

ここまできたら、別のマシンを PXE ブートで起動して、boot プロンプトで cobbler import で作成したイメージの名前を入力。

boot: f7-i386

あとは勝手にインストールが始まる。

以下のように system 登録しておくと、PXE ブート時にイメージ名を入力しなくても、勝手に割り当てられたイメージでブートしてくれる。

$ sudo cobbler system add --name=test-server --mac=00:0C:29:7E:3A:8B --profile=f7-i386

Updated on 2007/12/29 00:19