2015/10/14

fog-libvirt を使って Ruby から KVM を扱う

Ruby から KVM を扱ってみよう、ということで fog-libvirt を使ってみた話。

もともと fog という gem があって、OpenStack とか AWS とかを Ruby で扱うような gem みたいです。
それの libvirt 版が fog-libvirt 。
他にも ruby-libvirt とかあるのですが fog の方が扱いやすかったし、結局内部では ruby-libvirt を呼んでいるようです。


libvirt への remote access の設定

まずは KVM host 側の設定をします。
virsh の remote access の機能を使って fog-libvirt はアクセスするようなので、remote access を許可するように設定してやらないといけません。
具体的な設定方法は参考URLを参照してください。

remote access が何かと言えば、 virsh でやる時に
  • $ virsh -c 'qemu+tcp://hoge.exmaple.com/system'
とか書くやつです。

それが fog-libvirt を使うと、sasl での認証だと

  • Fog::Compute.new(provider: 'libvirt', libvirt_uri: 'qemu+tcp://user@hoge.example.com/system', libvirt_username: 'user',libvirt_password: 'password')
みたいに書きます。
public key を使った ssh だと

  • Fog::Compute.new(provider: 'libvirt',libvirt_uri: 'qemu+ssh://user@hoge.example.com/system?keyfile=/path/to/key')
みたいになります。public key の path を URI に書くような形式っぽいです。



fog-libvirt を使ったKVM操作

接続できればあとはいろいろできます。

  • connection = Fog::Compute.new(provider: 'libvirt',libvirt_uri: 'qemu+ssh://user@hoge.example.com/system?keyfile=/path/to/key')
    • KVM への接続
  • server = connection.servers.find{|s| s.name == 'hogehoge'}
    • domain name 'hogehoge' で define された VM を探してくる
  • server.active? #=> true or false
    • 電源が入ってるかチェック
  • server.start
    • VM 起動
  • server.halt
    • VM 停止
  • connection.volumes
    • イメージファイルの一覧表示とか。
    • define された domain に引っついてるディスクの一覧が手に入る。
  • volume = connection.volumes.find{|v| v.name = 'fugafuga.qcow2'}
    • 'fugafuga.qcow2' を探してくる
  • volume.clone_volume('piyopiyo.qcow2')
    • volume の clone もできます。


テンプレートVM の clone

特定の VM をテンプレートとして、そのテンプレートを clone する機能が欲しいな、ということになりました。
Fog::Libvirt::Compute::Server#create には volume_template_name を指定するオプションがあるのですが、どうも思ってたように動かない。
確認すると volume の clone には成功しているようですが、clone した後の VM の volume が template と同じ。
どうやら Fog::Libvirt::Compute::Volume#clone_volume は clone すると template の方を return する様子。
これじゃ新しいVMの volume が clone対象の方だ、ということで clone し終わった方の volume を返すように変更。
加えて、テンプレートと clone した後の volume の storage pool を分けたかったので  Fog::Libvirt::Compute::Volume#clone_volume に storage pool の指定もできるようにしてみました
ドキュメントがほとんど無かったので割とソース読んで手探り。
gem はだいたいソースが見られるので良いですね。

例えばこんな感じで使います。

  • cloned_vol = template_vol.clone_volume('new-vm-volume-name', 'new-pool')
  • kvm.servers.create(name: 'new-vm-nameloned_vm_name' , volumes: [cloned_vol])


ストレージプールの話

説明が後になっているのでよろしく無いのですが、KVM にはストレージプールというものがあるらしいです。
特定のディスクやディレクトリを virsh 経由で操作できるようにするものみたいですね。
こいつを設定しておくと特定のディレクトリの下に clone したイメージを fog-libvirt 経由で自由に作ったり消したりできるようになります。

例えば pool を作るには

  • virsh pool-define-as vm_pool dir - - - - /path/to/dir
  • virsh pool-build vm_pool
  • virsh pool-start vm_pool
  • virsh pool-autostart vm_pool
とかします。

そうすると
  • virsh vol-list --pool vm_pool
    • volume の一覧
  • virsh vol-clone --pool vm_pool tempalte.qcow2 new.qcow2
    • volume の clone
  • virsh vol-delete --pool vm_pool garbage.qcow2
    • volume の削除
とかできるようになります。もちろん fog-libvirt 側でもOK。
あと、ストレージプールにしたディレクトリの下にディレクトリがあると、 fog-libvirt 側の list が上手く動かなかったりする様子。ディレクトリ作らない方が良さそうですね。

そんなこんなで fog-libvirt を使って KVM をいじってみたよ、というお話でした。


使った環境情報

実行OS : OSX Yosemite 10.10.5, CentOS 7.1
Ruby : 2.2.3
KVM Host : CentOS 7.1 + libvirt 1.2.8,  Fedora 21 + libvirt


参考URL


0 件のコメント:

コメントを投稿