docker: WebVirtCloud

KVMの使い勝手を向上できないかということでWeb GUI経由で操作が可能なWebVirtCloudというのを導入してみる。Dockerを使ったインストール方法もGitHub内のwikiに整備されているが、そちらを参考にしつつホスト側ではgit cloneしないでコンテナ内でgit cloneする方法でコンテナを構築する。

始めにsecret_keyを作成する。python3を使った乱数生成のコードが用意されているのでこちらを使って生成すればよい。実行結果例は次。

# python3 secret_generator.py
rY?Sl`CUa~K&is.NVcRv,t0kY^Hqb>tKbi.82lz<Dty~OgnWX<

公式のDockerFileを参考にしながらDockerFileを作成する。先ほど作成したSECRET_KEYは設定ファイル作成時に必要になるのでDockerFile内に埋め込んでおく。

# cat Dockerfile
ARG FLAVOR=18.04-1.0.0
FROM phusion/baseimage:${FLAVOR}
ARG SECRET_KEY=rY?Sl`CUa~K&is.NVcRv,t0kY^Hqb>tKbi.82lz<Dty~OgnWX<
#
RUN set -eux && \
echo 'APT::Get::Clean=always;' >> /etc/apt/apt.conf.d/99AutomaticClean && \
apt -y update && apt -y upgrade && \
apt install -y --no-install-recommends \
  git \
  vim \
  python3-virtualenv \
  python3-dev \
  python3-lxml \
  python-libvirt \
  virtualenv \
  libvirt-dev \
  zlib1g-dev \
  pkg-config \
  gcc \
  nginx \
  libsasl2-modules && \
apt clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
#
mkdir -p /srv && cd /srv && \
export GIT_SSL_NO_VERIFY=1 && \
git clone https://github.com/retspen/webvirtcloud.git webvirtcloud && \
cd /srv/webvirtcloud && \
rm -rf ./doc/ ./Vagrantfile && \
mkdir ./data && \
cp ./webvirtcloud/settings.py.template ./webvirtcloud/settings.py && \
sed -i "s/SECRET_KEY = ''/SECRET_KEY = '${SECRET_KEY}'/g" ./webvirtcloud/settings.py && \
sed -i "s/TIME_ZONE = 'UTC'/TIME_ZONE = 'JST'/g" ./webvirtcloud/settings.py && \
sed -i "s|'db.sqlite3'|'data/db.sqlite3'|g" ./webvirtcloud/settings.py && \
chown -R www-data:www-data /srv/webvirtcloud
#
WORKDIR /srv/webvirtcloud
RUN set -eux && \
# Setup webvirtcloud
cd /srv/webvirtcloud && \
virtualenv --python=python3 venv && \
. venv/bin/activate && \
  pip3 install -U pip && \
  pip3 install -r conf/requirements.txt && \
  python3 manage.py migrate && \
  deactivate && \
chown -R www-data:www-data /srv/webvirtcloud && \
#
# Setup Nginx
echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \
rm /etc/nginx/sites-enabled/default && \
chown -R www-data:www-data /var/lib/nginx && \
cp /srv/webvirtcloud/conf/nginx/webvirtcloud.conf /etc/nginx/conf.d/ && \
#
# Register Services to runit
mkdir -p /etc/service/nginx && \
mkdir -p /etc/service/nginx-log-forwarder && \
mkdir -p /etc/service/webvirtcloud && \
mkdir -p /etc/service/novnc && \
cp /srv/webvirtcloud/conf/runit/nginx               /etc/service/nginx/run && \
cp /srv/webvirtcloud/conf/runit/nginx-log-forwarder     /etc/service/nginx-log-forwarder/run && \
cp /srv/webvirtcloud/conf/runit/novncd.sh           /etc/service/novnc/run && \
cp /srv/webvirtcloud/conf/runit/webvirtcloud.sh     /etc/service/webvirtcloud/run
#
WORKDIR /var/www
EXPOSE 28080
EXPOSE 6080
ENTRYPOINT ["/sbin/my_init"]
CMD [""]

KVMの操作を行うためのユーザーをホスト側に作成する。手順はwebvirtmgrの方に書いてあるので参考にする。

# groupadd -g 1010 webvirtcloud
# useradd -u 1010 -g webvirtcloud -s /sbin/nologin -d /home/webvirtcloud
# chown -R webvirtcloud:webvirtcloud /home/webvirtcloud

docker-compose.ymlの例は次

version: '2.3'
services:

  webvirtcloud:
    image: webvirtcloud:1
    container_name: 'webvirtcloud'
    volumes:
      - './files/webvirtmgr/.ssh:/var/www/.ssh'
      - './files/data/db.sqlite3:/srv/webvirtcloud/data/db.sqlite3'
      - './files/conf/webvirtcloud.conf:/etc/nginx/conf.d/webvirtcloud.conf'
      - './files/conf/runit/nginx:/etc/service/nginx/run'
      - './files/conf/runit/nginx-log-forwarder:/etc/service/nginx-log-forwarder/run'
      - './files/conf/runit/novncd.sh:/etc/service/novnc/run'
      - './files/conf/runit/webvirtcloud.sh:/etc/service/webvirtcloud/run'
    network_mode: 'host'
    extra_hosts:
      - KVM1:127.0.0.1
    ports:
      - 28080:28080/tcp
      - 6080:6080/tcp
    entrypoint: "/sbin/my_init"
    command: ""
    restart: unless-stopped

volumesでマウントしているファイルのうち.sshのものはホスト側で作成しておく。コンテナではwww-dataがファイルを使用するので、configとsshの鍵はwww-data(今回のベースを使っていれば、恐らくユーザID, グループID共に33のはず)向けの権限設定を行う。他のファイルは設定の永続化等に使うものなのでコンテナを仮稼働させてからホストにコピーして置く。

無事に稼働させられれば、ホストの28080で動いているはずなのでログインする。デフォルトのユーザ名とパスワードはadmin/adminなのでパスワードの変更を行う。

ComputesのSSHからKVMサーバを登録する
Guestの画面をWEB経由で映すことができる

KVMサーバを登録することで情報を取得し、GUESTの起動や停止、再起動の他、GUEST画面の表示や操作が行える。ただし、GUESTの操作はマウスがずれるなどで操作感が悪く、常用は難しい。OSのインストールぐらいは行えると思うので、通常時はVNCやリモートデスクトップを使うようにする。尚、GUESTの停止や再起動はクリックすると即座に実行されるので要注意。

環境用意するのに結構時間がかかったが使う場面は少ない・・・
これで気軽にGuestの作成やOSインストールが行えるといいが、手元にサーバがあるならvirt-managerを使った方が楽なので用途は限られるソフトな印象。