もともと 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を参照してください。
具体的な設定方法は参考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
0 件のコメント:
コメントを投稿