WebVirtCloud
Python 3.x 和 Django 4.2 LTS
功能特性
- QEMU/KVM 虚拟机管理
- QEMU/KVM 实例管理 - 创建、删除、更新
- 基于网页的虚拟机和实例统计信息
- 管理多个 QEMU/KVM 虚拟机
- 管理虚拟机数据存储池
- 管理虚拟机网络
- 通过浏览器访问实例控制台
- 基于 Libvirt API 的网页管理界面
- 基于用户的授权和认证
- 用户可以在实例中为 root 添加 SSH 公钥(仅在 Ubuntu 上测试过)
- 用户可以在实例中更改 root 密码(仅在 Ubuntu 上测试过)
- 支持 cloud-init 数据源接口
警告!!!
如何在虚拟机上更新 gstfsd
守护进程:
wget -O - https://bit.ly/2NAaWXG | sudo tee -a /usr/local/bin/gstfsd
sudo service supervisor restart
描述
WebVirtCloud 是一个面向管理员和用户的虚拟化 Web 界面。它可以将虚拟机委派给用户。noVNC 查看器为客户域提供完整的图形控制台。目前仅支持 KVM 虚拟机。
使用安装程序快速安装(测试版)
安装操作系统并运行指定命令。安装程序支持的操作系统:Ubuntu 18.04/20.04、Debian 10/11、Centos/OEL/RHEL 8。 可以安装在虚拟机、物理主机或 KVM 主机上。
wget https://raw.githubusercontent.com/retspen/webvirtcloud/master/install.sh
chmod 744 install.sh
# 使用 sudo 或 root 用户运行
./install.sh
手动安装
生成密钥
克隆仓库后应该生成 SECRET_KEY。然后将其放入 webvirtcloud/settings.py 中。
import random, string
haystack = string.ascii_letters + string.digits + string.punctuation
print(''.join([random.SystemRandom().choice(haystack) for _ in range(50)]))
安装 WebVirtCloud 面板(Ubuntu 18.04+ LTS)
sudo apt-get -y install git virtualenv python3-virtualenv python3-dev python3-lxml libvirt-dev zlib1g-dev libxslt1-dev nginx supervisor libsasl2-modules gcc pkg-config python3-guestfs libsasl2-dev libldap2-dev libssl-dev
git clone https://github.com/retspen/webvirtcloud
cd webvirtcloud
cp webvirtcloud/settings.py.template webvirtcloud/settings.py
# 现在将密钥放入 webvirtcloud/settings.py
sudo cp conf/supervisor/webvirtcloud.conf /etc/supervisor/conf.d
sudo cp conf/nginx/webvirtcloud.conf /etc/nginx/conf.d
cd ..
sudo mv webvirtcloud /srv
sudo chown -R www-data:www-data /srv/webvirtcloud
cd /srv/webvirtcloud
virtualenv -p python3 venv
source venv/bin/activate
pip install -r conf/requirements.txt
python3 manage.py migrate
python3 manage.py collectstatic --noinput
sudo chown -R www-data:www-data /srv/webvirtcloud
sudo rm /etc/nginx/sites-enabled/default
重启服务以运行 WebVirtCloud:
sudo service nginx restart
sudo service supervisor restart
在服务器上设置 libvirt 和 KVM
wget -O - https://bit.ly/36baWUu | sudo sh
完成!!
安装 WebVirtCloud 面板(CentOS8/OEL8)
sudo yum -y install epel-release
sudo yum -y install python3-virtualenv python3-devel libvirt-devel glibc gcc nginx supervisor python3-lxml git python3-libguestfs iproute-tc cyrus-sasl-md5 python3-libguestfs libsasl2-dev libldap2-dev libssl-dev
创建目录并克隆仓库
sudo mkdir /srv && cd /srv
sudo git clone https://github.com/retspen/webvirtcloud && cd webvirtcloud
cp webvirtcloud/settings.py.template webvirtcloud/settings.py
# 现在将密钥放入 webvirtcloud/settings.py
# 手动创建密钥或使用以下命令
sudo sed -r "s/SECRET_KEY = ''/SECRET_KEY = '"`python3 /srv/webvirtcloud/conf/runit/secret_generator.py`"'/" -i /srv/webvirtcloud/webvirtcloud/settings.py
开始安装 webvirtcloud
virtualenv-3 venv
source venv/bin/activate
pip3 install -r conf/requirements.txt
cp conf/nginx/webvirtcloud.conf /etc/nginx/conf.d/
python3 manage.py migrate
python3 manage.py collectstatic --noinput
为 CentOS 配置 supervisor
在 [include] 行后添加以下内容(实际上是在 files = ... 之后):
sudo vim /etc/supervisord.conf
[program:webvirtcloud]
command=/srv/webvirtcloud/venv/bin/gunicorn webvirtcloud.wsgi:application -c /srv/webvirtcloud/gunicorn.conf.py
directory=/srv/webvirtcloud
user=nginx
autostart=true
autorestart=true
redirect_stderr=true
[program:novncd]
command=/srv/webvirtcloud/venv/bin/python3 /srv/webvirtcloud/console/novncd
directory=/srv/webvirtcloud
user=nginx
autostart=true
autorestart=true
redirect_stderr=true
编辑 nginx.conf 文件
你需要编辑主 nginx.conf 文件,因为 rpm 包中的文件无法使用。注释以下行:
# server {
# listen 80 default_server;
# listen [::]:80 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
同时确保 /etc/nginx/conf.d/webvirtcloud.conf 文件中的路径正确:
upstream gunicorn_server {
#server unix:/srv/webvirtcloud/venv/wvcloud.socket fail_timeout=0;
server 127.0.0.1:8000 fail_timeout=0;
}
server {
listen 80;
server_name servername.domain.com;
access_log /var/log/nginx/webvirtcloud-access_log;
location /static/ {
root /srv/webvirtcloud;
expires max;
}
location / {
proxy_pass http://gunicorn_server;
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 1800;
proxy_read_timeout 1800;
proxy_send_timeout 1800;
client_max_body_size 1024M;
}
}
更改权限,使 nginx 可以读取 webvirtcloud 文件夹:
sudo chown -R nginx:nginx /srv/webvirtcloud
更改 selinux 权限:
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/webvirtcloud(/.*)"
sudo setsebool -P httpd_can_network_connect on -P
将所需用户添加到 kvm 组(如果不是使用 root 安装):
sudo usermod -G kvm -a <用户名>
在防火墙上允许 http 端口:
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-port=6080/tcp
sudo firewall-cmd --add-port=6080/tcp --permanent
让我们重启 nginx 和 supervisord 服务:
sudo systemctl restart nginx && systemctl restart supervisord
最后,检查所有内容是否正在运行:
sudo supervisorctl status
gstfsd RUNNING pid 24662, uptime 6:01:40
novncd RUNNING pid 24661, uptime 6:01:40
webvirtcloud RUNNING pid 24660, uptime 6:01:40
Apache mod_wsgi 配置
WSGIDaemonProcess webvirtcloud threads=2 maximum-requests=1000 display-name=webvirtcloud
WSGIScriptAlias / /srv/webvirtcloud/webvirtcloud/wsgi_custom.py
在主机服务器上安装 libvirtd 和其他最终所需的包
wget -O - https://clck.ru/9V9fH | sudo sh
完成!!
通过 runit 运行 novncd 的替代方案(Debian)
通过 runit 运行 novncd 是 supervisor 的替代方案。
在 Debian 系统上安装 runit 并配置 novncd 服务:
apt install runit runit-systemd
mkdir /etc/service/novncd/
ln -s /srv/webvirtcloud/conf/runit/novncd.sh /etc/service/novncd/run
systemctl start runit.service
默认凭据
登录: admin
密码: admin
配置计算节点 SSH 连接
这是配置云端和计算节点 SSH 连接的简短示例。
在 webvirtcloud 机器上,你需要生成 SSH 密钥,并可选择禁用 StrictHostKeyChecking。
chown www-data -R ~www-data
sudo -u www-data ssh-keygen
cat > ~www-data/.ssh/config << EOF
Host *
StrictHostKeyChecking no
EOF
chown www-data -R ~www-data/.ssh/config
你需要将云端公钥放入计算节点的授权密钥中。最简单的方法是使用 webvirtcloud 服务器上的 ssh 工具。
sudo -u www-data ssh-copy-id root@compute1
主机 SMBIOS 信息不可用
如果你看到警告
Unsupported configuration: Host SMBIOS information is not available
那么你需要在主机上使用包管理器安装 dmidecode
包,并重启 libvirt 守护进程。
Debian/Ubuntu 系:
sudo apt-get install dmidecode
sudo service libvirt-bin restart
Arch Linux
sudo pacman -S dmidecode
systemctl restart libvirtd
Cloud-init
目前仅支持 root SSH 授权密钥和主机名。以下是 cloud-init 客户端的示例配置。
datasource:
OpenStack:
metadata_urls: [ "http://webvirtcloud.domain.com/datasource" ]
反向代理
编辑 settings.py 文件中的 WS_PUBLIC_PORT,将重定向暴露到 80 或 443 端口。默认值:6080
WS_PUBLIC_PORT = 80
如何更新
# 进入安装目录
cd /srv/webvirtcloud
source venv/bin/activate
git pull
pip3 install -U -r conf/requirements.txt
python3 manage.py migrate
python3 manage.py collectstatic --noinput
sudo service supervisor restart
运行测试
执行测试的服务器必须已安装并运行libvirt。 它不能包含任何虚拟机。 它必须有一个名为"default"的存储池,且不包含任何磁盘镜像。 它必须有一个名为"default"的网络,并且该网络必须处于开启状态。 设置虚拟环境
python -m venv venv
source venv/bin/activate
pip install -r conf/requirements.txt
运行测试
python manage.py test
LDAP配置
以下配置选项可以在webvirtcloud/settings.py
文件中修改。这里展示了Active Directory和OpenLDAP的配置示例。这是运行LDAP的最小配置,更多信息请阅读django-auth-ldap文档。
启用LDAP
sudo sed -i "s~#\"django_auth_ldap.backend.LDAPBackend\",~\"django_auth_ldap.backend.LDAPBackend\",~g" /srv/webvirtcloud/webvirtcloud/settings.py
设置LDAP服务器名称和绑定DN
# Active Directory
AUTH_LDAP_SERVER_URI = "ldap://example.com"
AUTH_LDAP_BIND_DN = "username@example.com"
AUTH_LDAP_BIND_PASSWORD = "password"
# OpenLDAP
AUTH_LDAP_SERVER_URI = "ldap://example.com"
AUTH_LDAP_BIND_DN = "CN=username,CN=Users,OU=example,OU=com"
AUTH_LDAP_BIND_PASSWORD = "password"
设置用户过滤器以及用户和组搜索基础和过滤器
# Active Directory
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"CN=Users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"
)
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
"CN=Users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(objectClass=group)"
)
AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType()
# OpenLDAP
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"CN=Users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(cn=%(user)s)"
)
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
"CN=Users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(objectClass=groupOfUniqueNames)"
)
AUTH_LDAP_GROUP_TYPE = GroupOfUniqueNamesType() # 需要在settings.py顶部更改导入
设置访问WebVirtCloud所需的组。您可以将此设置为False
以禁用此过滤器。
AUTH_LDAP_REQUIRE_GROUP = "CN=WebVirtCloud Access,CN=Users,DC=example,DC=com"
使用LDAP中的值填充用户字段
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_staff": "CN=WebVirtCloud Staff,CN=Users,DC=example,DC=com",
"is_superuser": "CN=WebVirtCloud Admins,CN=Users,DC=example,DC=com",
}
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail",
}
现在,当您使用LDAP用户登录时,它将被分配定义的权限。用户将通过LDAP进行身份验证,然后通过WebVirtCloud权限进行授权。
如果您想将用户从LDAP迁移到WebVirtCloud,只需从UI更改其密码,并(最终)从LDAP组中删除该用户。
REST API / 测试版
WebVirtCloud提供了REST API以供程序访问。 要访问API方法,请在浏览器中打开并使用Swagger界面查看它们
http://<webvirtloud-address:port>/swagger
http://<webvirtloud-address:port>/redoc
截图
实例详情:
实例列表:
其他:
许可证
WebVirtCloud 根据 Apache 许可证 2.0 版授权。