1. Installation

1.1 Pakete

Installation Pakete und Abhängigkeiten:

apt-get install git python-pip python-libvirt python-libxml2 novnc supervisor nginx

Installation von Abhängigkeiten und Django-Umgebung:

mkdir devel
cd devel/
git clone git://github.com/retspen/webvirtmgr.git
cd webvirtmgr
pip install -r requirements.txt
./manage.py syncdb

Die Fragen der Installation beantworten:

You just installed Django's auth system, which means you don't have any superusers defined.

Would you like to create one now? (yes/no): yes (Put: yes)

Username (Leave blank to use 'admin'): admin (Put: your username or login)

E-mail address: username@domain.local (Put: your email)

Password: xxxxxx (Put: your password)

Password (again): xxxxxx (Put: confirm password)

Superuser created successfully.

./manage.py collectstatic

Weitere Fragen beantworten:

You have requested to collect static files at the destination
location as specified in your settings.

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: (Put: yes)

Optional: Weitere Superuser anlegen:

./manage.py createsuperuser

1.2 NGINX

Da die Software nur den python-eigenen Webserver mitbringt, welcher keine Verschlüsselung unterstützt und auch per Default nur auf locahost Port 8000 lauscht, haben wir oben NGINX installiert und richten diesen nun so ein, dass er Anfragen von extern https-verschlüsselt annimmt und diese unverschlüsselt nach intern weiterleitet. So könnt ihr den Webmgr auf einem Standard-Webport (80 bzw. 443) erreichen und habt auch sonst alle Features des als sehr sicher geltenden NGINX-Webservers.

cd ..
mv webvirtmgr /var/www/html/
vim /etc/nginx/sites-available/webvirtmgr.conf
:set paste

Folgenden Inhalt einfügen:

server {
    listen 80 default_server;

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

    location /static/ {
        root /var/www/html/webvirtmgr/webvirtmgr;
        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 $scheme;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M;
    }
}

Default Config löschen (wir haben ja jetzt eine viel bessere), Rechte setzen und Vhost verlinken:

rm /etc/nginx/sites-enabled/default
chown -R www-data:www-data /var/www/
ln -s /etc/nginx/sites-available/webvirtmgr.conf /etc/nginx/sites-enabled/

Anschließend den Webserver neu starten:

systemctl restart nginx

1.3 Supervisor

Jetzt müssen wir noch den tollen Python-Unterbau dazu bekommen, automatisch zu starten wie es auch unser NGINX bereits tut. Ab Debian 8 erstellt man am besten eine dedizierte UNIT für den Systemd. Ich mache das hier mal klassisch mit Supervisord.

vim /etc/supervisor/conf.d/webvirtmgr.conf
:set paste

Content einfügen:

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

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

Und den Supervisor restarten:

systemctl status supervisor

1.4 Test

Nun kann man noch eben mit ss -nlp | grep 8000 prüfen, ob der Python-Daemon rennt.

Wenn ja, sollte sich über FQDN bzw. die IP des Hosts bereits die WebMGMT-Konsole aufrufen lassen können: http://172.21.22.14.

2. Konfiguration und Einrichtung

2.1 Verbindung zur Remote-Instanz

Damit der Python Libvirt-Client sich mit einer Remote-Instanz von KVM verbinden kann, müssen für jede Verbindung entsprechend SSH-Keys hinterlegt werden. Vorrausgesetzt man möchte die Verbindung per SSH aufbauen. Es stehen noch Libvirt-TCP, TLS und Local-Socket zur Verfügung.

Wenn ihr die Web-Konsole auf dem KVM-Host installiert habt könnt ihr ein lokales Datei-Socket verwenden. Ich wollte den Host nicht zu müllen und habe die Konsole deshalb auf einer VM installiert. Alles im lokalen Netz und nicht von außen erreichbar. Ich mache die Verbindung also per SSH mit hinterlegtem Key. Auch brauche ich hier nur eine Verbindung weil ich nur einen KVM-Host habe.

2.1.1 SSH-Auth

Auf Client-Server:

Erstmal müssen wir zum Benutzer www-data werden. Falls euer NGINX als anderer Benutzer läuft, diesen hier einsetzen. Dann erstellen wir ein Key-Pair. Fragen wie im Bild beantworten (ENTER + ENTER + ENTER). Anschließend SSH-Config anlegen.

sudo su - www-data -s /bin/bash
ssh-keygen
touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
chmod 0600 ~/.ssh/config
ssh-copy-id webvirtmgr@<kvm-host>

SSH-Keygen

Login testen mit ssh webvirtmgr@<kvm-host>

Jetzt geht ihr auf euren KVM-Host und tippelt dort auch noch ein paar Befehle ein.

Auf KVM-Host:

User für Login vom Webclient anlegen, Passwort setzen und mit Rechten versehen:

adduser webvirtmgr
passwd webvirtmgr
usermod -G libvirt -a webvirtmgr

Nun kann man in der Webkonsole eine neue Verbindung anlegen und beim Typ SSH auswählen wie im Bild zu sehen:

Danach sieht man auch schon seine VMs und kann sie entsprechend managen.

Unter Anderem lassen sich auch Graphen von CPU und RAm Usage abrufen. Schon sehr nett.

Was ich noch nicht gefunden habe sind Einstellungen zum Hinzufügen von Festplatten o.Ä. Vielleicht kommt das noch.

Zum systemunabhängigen Administrieren der VMs eignet es sich allemal. Endlich kein lästiges Rumprobieren mehr mit Cygwin oder Xming von meinem Windows aus (nutze ich natürlich nur gelegentlich) auf den KVM-Host zu kommen. Gerade wenn mehrere Benutzer den Host administrieren müssen, eignet sich die Webkonsole hervorragend.