2012年2月21日火曜日

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

こんにちは、OSSテクノロジーセンターの原です。

さて、前回は Ruby のスクリプトから libvirt にアクセスし、ゲストの一覧を取得するところまでできました。

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

前回までのおさらいとしては

  • libvirt は Red Hat 社が中心に開発する、仮想化管理用の標準 API
  • libvirt には様々な言語バインディングがる
  • Ruby から API にアクセススして、仮想マシン一覧を出してみる

ここまでですね。

今回はここから一歩進んで、Web アプリとしての機能を持たせて行きましょう。

今回利用する sinatra についてですが、細かい使い方については割愛させて頂きます。

…と言っても、公式に非常にわかりやすいドキュメントがありますので、初めての方はそちらをざっと眺めてもらえればと思います。

Sinatra: README (Japanese)

ではお約束通り、前回インストールした sinatra の最も簡単な Hello world 画面をブラウザに表示するところまでやってみましょう。

# mkdir webvirt
# cd webvirt
# vim webvirt.rb
webvirt.rb:
#!/usr/bin/ruby
require 'rubygems'
require 'sinatra'

get '/' do
  'Hello world!'
end

実行権限を与えてアプリを立ち上げましょう。

# chmod +x webvirt.rb 
# ./webvirt.rb 

ブラウザから http://webvirt:4567/ にアクセスしてみましょう。

(※ webvirt の部分は適宜 IP アドレス等に読み替えてください。また、ファイアウォールが閉まっている場合、該当ポート開放をお忘れなく。)

Hello world が表示できたでしょうか?アプリを止めるには Ctrl + c です。

できましたら libvirt との連携を考えてみましょう。

前回最後に書いたスクリプトをそのまま Web に出してみましょう。

前回の 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

これと同じ機能を持つ Web 画面を作ってみましょう。

webvirt.rb:
#!/usr/bin/ruby
require 'rubygems'
require 'sinatra'
require 'libvirt'

get '/' do
  conn = Libvirt::open("qemu+ssh://root@kvmhost/system")
  @vm_list = conn.list_defined_domains
  erb :index
end
# mkdir ./views
# vim views/index.erb
views/index.erb:
<b>My KVM VMs</b>
<hr>
<% for vm in @vm_list %>
  <%= vm %><br>
<% end %>

1つのファイル(webvirt.rb)だけで全てを完結させても良いのですが、見通しが悪くなるので、処理系と画面のファイルは分けてみました。

中身を軽く見て行きましょう。

webvirt.rb で require 'libvirt' して、conn = Libvirt::open? で接続、conn.list_defined_domains でリストを取得しています。

ここまでは前回と同じですね。

views/index.erb で画面を作りつつ、@vm_list の中身を for 文で展開しつつ、改行を入れておきました。

ここまでできたら、再びアプリを起動して、ブラウザからアクセスしてみてください。

# ./webvirt.rb 

画面にリストが表示できたでしょうか?

前回も最後に書きましたが、list_defined_domains メソッドは非アクティブなゲストマシンのリストを取得します。

次はアクティブなゲストマシンのリストも一緒に表示しましょう。

webvirt.rb:
#!/usr/bin/ruby
require 'rubygems'
require 'sinatra'
require 'libvirt'

get '/' do
  conn = Libvirt::open("qemu+ssh://root@kvmhost/system")
  @act_vm_list = conn.list_domains
  @sby_vm_list = conn.list_defined_domains
  erb :index
end
views/index.erb
<b>My KVM VMs</b>
<hr>
Active VMs<br>
<% for act_vm in @act_vm_list %>
  <%= act_vm %><br>
<% end %>

<hr>
Standby VMs<br>
<% for sby_vm in @sby_vm_list %>
  <%= sby_vm %><br>
<% end %>

どうでしょう?アクティブ・非アクティブ両方のゲストマシンの一覧がでましたね。

ところで、アクティブなゲストマシンの方は、名前でなくて ID で表示されていますね。

大変面倒なことに list_domains と list_defined_domains は若干挙動が違うのです。ちょっと格好が悪いのでこれは後々直すことにしましょう。

詳しくは各メソッドの詳細をご確認ください。

いかがでしたでしょうか。

少し長くなってしまいましたので、仮想マシンのパワーオン/オフは次回以降に回したいと思います。

ではでは。

0 件のコメント:

コメントを投稿