webvirtmgrでKVMをブラウザ経由で制御する

KVMを使った仮想環境の管理に今まではvirt-managerを使っていたのですが、ssh -X経由でGUIウィンドウを操作するのが少々面倒に感じてきました。

ブラウザ経由で操作する方法はないかなと調べてみたところ、webvirtmgrというパッケージを見つけました。virt-managerでKVMを管理している環境上にwebvirtmgrを導入する手順を記載します。

1 webvirtmgrのインストール

1.1 必要パッケージ

私の環境はCentOS7なので、以下のコマンドでインストールします。

sudo yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
sudo yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx

1.2 webvirtmgr

webvirtmgrをダウンロードし、pythonのスクリプトを動かします。

git clone git://github.com/retspen/webvirtmgr.git
cd webvirtmgr
sudo pip install -r requirements.txt

以下のコマンドでyesを入力し、username, email, passwordを入力します。

./manage.py syncdb

以下のコマンドでyesを入力します。

./manage.py collectstatic

以下のコマンドでsuperuserの設定をします。先ほど入力したusernameとは別の名前を入力し、email、passwordを設定します。

./manage.py createsuperuser

ここで作成したusernameとpasswordはブラウザでwebvirtmgrにログインした際に使用します。

webvirtmgrを/var/wwwに設置します。

sudo cp -a ../webvirtmgr /var/www/

1.3 Nginx

webvirtmgrのユーザ・グループをnginxに変更します。

sudo chown -R nginx:nginx /var/www/webvirtmgr

Nginxの設定ファイルを追加します。

sudo emacs /etc/nginx/conf.d/webvirtmgr.conf

webvirtmgr.confの内容は以下の通りです。

server {
    listen 80 default_server;

    server_name $hostname;
    #access_log /var/log/nginx/webvirtmgr_access_log;

    location /static/ {
        root /var/www/webvirtmgr/webvirtmgr; # or /srv instead of /var
        expires max;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Proto $remote_addr;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M; # Set higher depending on your
        needs
    }
}

/etc/nginx/nginx.confでポート80のserverをコメントアウトします。

diff -uprN /etc/nginx/nginx.conf{.bak,}
--- /etc/nginx/nginx.conf.bak 2015-01-28 23:50:55.698136795 +0900
+++ /etc/nginx/nginx.conf 2015-01-28 23:51:29.321824910 +0900
@@ -42,31 +42,31 @@ http {
     # for more information.
     include /etc/nginx/conf.d/*.conf;

-    server {
-        listen       80 default_server;
-        server_name  localhost;
-        root         /usr/share/nginx/html;
-
-        #charset koi8-r;
-
-        #access_log  /var/log/nginx/host.access.log  main;
-
-        # Load configuration files for the default server block.
-        include /etc/nginx/default.d/*.conf;
-
-        location / {
-        }
-
-        # redirect server error pages to the static page /40x.html
-        #
-        error_page  404              /404.html;
-        location = /40x.html {
-        }
-
-        # redirect server error pages to the static page /50x.html
-        #
-        error_page   500 502 503 504  /50x.html;
-        location = /50x.html {
-        }
-    }
+#    server {
+#        listen       80 default_server;
+#        server_name  localhost;
+#        root         /usr/share/nginx/html;
+#
+#        #charset koi8-r;
+#
+#        #access_log  /var/log/nginx/host.access.log  main;
+#
+#        # Load configuration files for the default server block.
+#        include /etc/nginx/default.d/*.conf;
+#
+#        location / {
+#        }
+#
+#        # redirect server error pages to the static page /40x.html
+#        #
+#        error_page  404              /404.html;
+#        location = /40x.html {
+#        }
+#
+#        # redirect server error pages to the static page /50x.html
+#        #
+#        error_page   500 502 503 504  /50x.html;
+#        location = /50x.html {
+#        }
+#    }
 }

SELinuxで以下を許可します。CentOS7ではsetsebool -Pがreboot後にリセットされる為、/etc/selinux/targeted/booleansに下記を記述します。

httpd_can_network_connect=1
httpd_read_user_content=1

httpのポートを開きます。

firewall-cmd --permanent --add-service=http

Nginxを再起動します。

sudo service nginx restart

NginxをCentOS起動時に動くようにします。

sudo systemctl enable nginx.service

1.4 supervisord

/etc/supervisord.conに以下を追加します。

[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c
/var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx

[program:webvirtmgri-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx

supervisordを再起動します。

sudo service supervisord restart

supervisordをCentOS起動時に動くようにします。

sudo systemctl enable supervisord.service

1.5 novnc

novncはHTML5で記述されたvncクライアントです。

sudo cp /var/www/webvirtmgr/conf/initd/webvirtmgr-novnc-redhat /etc/init.d/webvirtmgr-novnc
sudo chkconfig --add webvirtmgr-novnc:
/etc/init.d/webvirtmgr-novnc start
firewall-cmd --add-port=6080/tcp --permanent

2 webvirtmgrの設定

2.1 接続

http://[Server Name]で接続できます。webvirtmgrが動作しているマシンからはhttp://localhost:8000でも接続でき ます。

2.2 ログイン

./manage.pyで作成したusernameとpasswordでログインします。

 

https://dl-web.dropbox.com/s/5cd42hgjttjdia4/0001_Login.png

2.3 VM環境の登録

Add ConnectionボタンでVM環境のマシンを登録します。

今回はwebvirtmgrと同じマシンのVM環境を使用する為、Local SocketでLabel名を入力するだけで登録は完了です。

 

https://dl-web.dropbox.com/s/uniyetd9wjud1c8/0002_AddConnection.png

2.4 vncの設定

virt-managerで作成した仮想マシンの設定ではnovnc接続が上手くいきませんでした。

そこで、仮想マシンのxmlのvncのエントリを次のように変更します。

- <graphics type='vnc' port='-1' autoport='yes'/>
+ <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
+   <listen type='address' address='0.0.0.0'/>
+ </graphics>

xmlの変更はvirsh editコマンド、あるいはwebvirtmgr上で実行できます。

sudo virsh edit [VMNAME]

 

https://dl-web.dropbox.com/s/ahspctvdb5sno4r/0003_ModifyNoVNC.png

 

novncの画面は以下の通りです。

 

https://dl-web.dropbox.com/s/2v5k2tipcsh1p0r/0004_NoVNC.png

3 まとめ

以上でvirt-manager相当の操作がブラウザ経由で可能となりました。かなり使いやすいと思います。

yumやaptで入れることができるようになると嬉しいですね。