4 个版本 (2 个破坏性更改)

0.4.1 2021年4月1日
0.3.0 2021年3月23日
0.2.1 2021年3月14日
0.2.0 2021年3月13日

#1772 in 密码学

GPL-3.0-or-later

80KB
1.5K SLoC

Rust 1.5K SLoC // 0.0% comments Python 333 SLoC // 0.1% comments Shell 26 SLoC // 0.4% comments

vmadm README

vmadm 是一个工具,用于在本地 libvirt 下创建和销毁虚拟机。虚拟机通过使用 YAML 编写的规范文件进行描述。

foo:
  cpus: 4
  memory_mib: 4096
  image_size_gib: 100

bar:
  cpus: 1
  memory_mib: 512
  image_size_gib: 1

规范文件中的所有机器将一次性创建或销毁。

用法

给定一个规范文件 machines.yaml,要创建虚拟机运行

$ vmadm new machines.yaml

要删除它们

$ vmadm delete machines.yaml

创建 VM 将创建一个基于基础镜像(也是 qcow2 格式)的磁盘镜像。删除 VM 也会删除镜像文件。除非规范文件明确指定镜像文件名,否则镜像文件将按照 VM 命名并放入配置的镜像目录中。

要获取内置的命令行帮助

$ vmadm help
$ vmadm --help

基础镜像是一个已安装了一些操作系统的镜像。它应在第一次引导时使用 [cloud-init][] 配置主机名和 SSH 密钥,或者至少不介意 VM 上附加了一个包含 cloud-init 配置的额外 ISO 磁盘。它应在引导时打开 SSH 端口。除了这些之外,vmadm 不关心它是什么。对于 Debian,位于 https://cloud.debian.org/ 的预制的 OpenStack 云镜像工作得很好。您需要自行下载基础镜像,vmadm 不会为您执行此操作。

配置

默认配置文件位于 XDG 配置目录下的 vmadm/config.yaml;默认情况下,这是 ~/.config/vmadm/config.yaml。配置文件可以指定以下字段

  • default_base_image – 默认基础镜像的路径
  • default_image_gib – VM 新镜像的默认大小,以 GiB 为单位
  • default_memory_mib – VM 的默认内存量,以 MiB 为单位
  • default_cpus – VM 的默认 CPU 数量
  • default_generate_host_certificate – 是否默认生成SSH主机证书?
  • image_directory – 虚拟机镜像文件存放的目录
  • authorized_keys – 要放入虚拟机默认用户的authorized_keys文件中的SSH公钥的文件名列表
  • ca_key – 默认CA 私钥 的路径名

指定字段

指定文件是YAML格式,可以指定以下字段,所有这些字段都覆盖了配置中的某些默认值。

  • ssh_key_files – 覆盖authorized_keys
  • image_size_gib – 覆盖default_image_giv
  • memory_mib – 覆盖default_memory_mib
  • cpus – 覆盖default_cpus
  • base – 覆盖default_base_image
  • image – 覆盖默认镜像文件名;必须包含
  • image – 覆盖默认镜像文件名;必须包含路径名,默认不会放入镜像目录
  • generate_host_certificate – 覆盖主机认证设置
  • ca_key – 覆盖默认CA密钥
  • rsa_host_key – 在主机上安装的RSA主机密钥
  • rsa_host_cert – 在主机上安装的RSA主机证书
  • dsa_host_key – 在主机上安装的DSA主机密钥
  • dsa_host_cert – 在主机上安装的DSA主机证书
  • ecdsa_host_key – 在主机上安装的ECDSA主机密钥
  • ecdsa_host_cert – 在主机上安装的ECDSA主机证书
  • ed25519_host_key – 在主机上安装的Ed25519主机密钥
  • ed25519_host_cert – 在主机上安装的Ed25519主机证书

不同的host_keyhost_cert字段指定了要在新虚拟机中安装的私钥和证书。公钥是从私钥计算出来的,因此不需要显式指定。这些字段应包含密钥或证书的文本,而不是其文件名。

如果指定了任何主机密钥,则不会生成主机证书:忽略generate_host_certificate设置。如果没有指定主机密钥,则会生成一个Ed25519密钥,并使用指定的CA证书进行签名。生成的密钥和证书将安装在新虚拟机中。

换句话说,如果您指定了任何主机密钥,您就可以手动完成所有操作。如果您想保持事情简单,请不要指定任何主机密钥,让vmadm为虚拟机生成主机密钥和主机证书。

日志记录

要启用日志记录,设置环境变量VMADM_LOG

$ VMADM_LOG=vmadm::libvirt vmadm list
 DEBUG vmadm::libvirt > connecting to libvirtd qemu:///system
 DEBUG vmadm::libvirt > listing all domains
$ 

vmadm使用Rust库env_logger进行日志记录,该库的文档在https://docs.rs/env_logger。环境变量可以通过日志级别、代码模块或两者同时启用。将其设置为trace将提供最详细的日志记录。

使用主机证书

主机证书允许您在不接受其主机密钥的情况下访问新创建的虚拟机。这对于虚拟机被重新创建且主机密钥发生变化的情况非常有用。您需要配置SSH客户端以信任使用给定SSH CA密钥制作的证书,但这是一次性操作。

您需要创建一个用作主机认证CA密钥的SSH密钥。运行以下命令

$ mkdir -m 0700 ~/.ssh/ca
$ ssh-keygen -f ~/.ssh/ca/vmadm_ca -t ed25519 -N ''

这创建了一个没有密码的密钥,因为vmadm目前不支持带密码的CA密钥。

请确保CA密钥的安全。不要将其用于其他任何用途。

将以下内容添加到您的SSH客户端使用的known_hosts文件中,全部在一个行上

@cert-authority * XXXX

其中 XXX 是CA密钥的公钥部分,如上面示例中存储在 ~/.ssh/ca/vmadm_ca.pub 中。这告诉您的客户端应该接受该行上的CA密钥用于所有主机(*)。如果您愿意,也可以仅限于一些主机。

主机设置

vmadm运行的主机需要运行libvirt,并且您必须可以访问qemu:///system连接。Debian wiki有一些有用的文档

我使用Ansible角色设置了自己的libvirt主机:[http://git.liw.fi/ansibleness/tree/ansible/roles/vmhost](http://git.liw.fi/ansibleness/tree/ansible/roles/vmhost)。它在Debian上工作。简短版本

  • 安装
    • libvirt(Debian软件包 libvirt-daemon-systemlibvirt-daemonlibvirt-daemon
    • virt-install(Debian软件包 virtinst
    • qemu-img(Debian软件包 qemu-uttils
    • VM的NSS查找(Debian软件包 libnss-libvirt
    • SSH客户端(Debian软件包 openssh-client
  • 确保您在libvirt组中
  • 编辑/etc/nsswitch.conf,在hosts行中添加libvirt libvirt_guest

依赖项

~8–20MB
~284K SLoC