2012年2月7日火曜日

連載「libvirt を利用して日々の作業を効率化」第1回

こんにちは。1月からサイオスに Join した 原です。

libvirt は Red Hat 社が中心に開発する、仮想化管理用の標準 API です。

サポートされているプロダクトであれば、全て同じように扱えるのが魅力です。

まずはおさらいとして、どんなものに対応しているか見てみます。

libvirt: Internal drivers に一覧が出ています。

The KVM/QEMU Linux hypervisor
The Xen hypervisor on Linux and Solaris hosts.
The LXC Linux container system
The OpenVZ Linux container system
The User Mode Linux paravirtualized kernel
The VirtualBox hypervisor
The VMware ESX and GSX hypervisors
The VMware Workstation and Player hypervisors
The Microsoft Hyper-V hypervisor
Virtual networks using bridging, NAT, VEPA and VN-LINK.
Storage on IDE/SCSI/USB disks, FibreChannel, LVM, iSCSI, NFS and filesystems

Xen や KVM を触っている(いた)方なら、libvirt の CLI ツールである virsh コマンドや、GUI ツールの virt-manager を利用したことがある方が多いのではないでしょうか。

単に virsh コマンドを利用するのも複数の Hypervisor に対応しているだけあって便利なのですが、API にアクセスする、"ちょっとしたツール"を作り、日々の作業を自動化することで、より libvirt の醍醐味を味わうことが出来ます。

"ちょっとしたツール"を作るにあたって、どんな言語バインディングがあるのかは、libvirt: Bindings for other languages をご確認ください。

この連載では、libvirt を中心に、仮想化インフラストラクチャの自動化にスポットを当てて、日々の作業を効率化するためのヒントを紹介できればと思います。

例として libvirt API を利用して、Web 画面から仮想マシンを立ち上げるサイトを作成してみたいと思います。

今回のサーバの構成は下記のようになります。

  • ホスト名: kvmhost - ハイパーバイザ(KVM, libvirtd, Scientific Linux 6.1) 1台
  • ホスト名: webvirt - Webサーバ(Ruby, libvirt-client, Scientific Linux 6.1) 1台
  • 仮想マシン 数台

Webサーバの構成

  • Ruby
  • Sinatra(DSL)
  • WEBrick(httpサーバ)
  • ruby-libvirt(libvirtクライアント)

以下、ハイパーバイザ側を kvmhost、Webサーバ側を webvirt と呼びます。

また、明示的にユーザ名を指定しない場合は全て root での作業となります。

今回は Webサーバとして Ruby にビルドインされた werick を、libvirt-client の言語バインディングとしては Ruby を利用しますが、どのWebサーバ・言語でも基本的な設計はかわりません。

kvmhost側は、既に KVM 及び libvirtd が稼動しているものとして、webvirt側の構築をします。

まずは EPEL リポジトリを追加して、必要なパッケージを導入します。

補足になりますが、EPEL リポジトリは RHEL のアップストリームである、Fedora Project の有志によって運営されている RHEL 向けの高品質なアドオンパッケージリポジトリです。

また、CentOS や Scientific Linux (SL) のような RHEL からスピンオフしたディストリビューションとの互換性もあります。

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
# yum install -y openssh-clients ruby rubygem-sinatra ruby-libvirt

次に、kvmhost と webvirt をどのように通信させるかを検討します。

libvirt の接続には ssh を始めいくつかの接続手段があります。

詳しくは libvirt: Remote support をご確認ください。

今回は最も簡単な ssh による接続を利用したいと思います。

webvirt側

# cd ~
# mkdir .ssh
# ssh-keygen
(質問は全てエンターで進んでしまって構いません)
# cd .ssh
# cat id_rsa.pub >> webvirt-id_rsa.pub
# scp ./webvirt-id_rsa.pub root@kvmhost/root/.ssh

kvmhost側

# cd .ssh/
# cat webvirt-id_rsa.pub >> authorized_keys

少しそれますが、例えば Ruby 組み込みの webrick ではなく、 Phusion Passenger(mod_rails for Apache)や、mod_perl、mod_php 等、他の言語で webサーバを Apache で動かしたい場合は下記の様に、Apacheユーザでノンパスワードログイン出来るようにしておきます。

# cd /var/www/
# mkdir .ssh
# chown apache.apache .ssh/
# sudo -u apache ssh-keygen
# cd .ssh
# cat id_rsa.pub >> webvirt-id_rsa.pub
# scp ./webvirt-id_rsa.pub root@kvmhost/root/.ssh

sudo で apache ユーザの ssh 鍵を作成するのがポイントです。

さて、話を戻して kvmhost側で ssh の受け入れが完了したら、webvirt からノンパスワードでログイン出来るか試してみましょう。

# ssh root@kvmhost

さて、ここまでで、libvirtd に接続できる環境が整いました。

Ruby で接続する前に virsh コマンドで接続できるか確認してみましょう。

# virsh -c qemu+ssh://kvmhost/system list --all
 Id Name                 State
----------------------------------
  - test1                shut off
  - test2                shut off

libvirt に登録されているゲストマシンの一覧が表示されればOKです。

できましたでしょうか?

できたら、今度は Ruby でゲストマシンの一覧を取得できるか試してみましょう。

get_vm_list.rb

#!/usr/bin/ruby
require 'libvirt'
conn = Libvirt::open("qemu+ssh://root@kvmhost/system")
vm_list = conn.list_defined_domains
puts vm_list
# chmod +x get_vm_list.rb
# ./get_vm_list.rb

Libvirt::open メソッドで接続し、list_defined_domains メソッドで非アクティブなゲストマシンの一覧を取得しています。

APIのドキュメントは下記に詳しく掲載されています。

Ruby bindings for libvirt

Ruby bindings for libvirt RDoc Documentation

いかがでしたしょうか。

次回はこの環境を使って、実際に Web画面から仮想マシンのパワーオン/オフが行えるようにしていきたいと思います。

ではでは。

0 件のコメント:

コメントを投稿