Cloud-Init 支持

'''Cloud-Init 是一个事实上的多发行版软件包,它负责虚拟机实例的早期初始化。使用 Cloud-Init,可以在虚拟机管理程序一侧配置网络设备和 ssh 密钥。当 VM 首次启动时,VM 内部的 Cloud-Init 软件将会应用这些设置。'''

许多Linux发行版提供了现成可用的Cloud-Init镜像,这些镜像主要设计用于’OpenStack'。这些镜像也能与{pve}一起使用。虽然获取这类现成镜像看起来很方便,但我们通常建议自己准备镜像。其优势在于您将确切知道自己安装了什么,这有助于您之后根据需求轻松定制镜像。

一旦你创建了这样一个Cloud-Init镜像,我们建议将其转换为虚拟机模板。从虚拟机模板,你可以快速创建链接克隆,因此这是快速部署新虚拟机实例的方法。你只需要在启动新的虚拟机之前配置网络(可能还有ssh密钥)。

我们推荐使用基于SSH密钥的身份验证方式来登录由Cloud-Init配置的虚拟机。也可以设置密码,但这种方式不如使用基于SSH密钥的身份验证安全,因为{pve}需要在Cloud-Init数据中存储该密码的加密版本。

{pve} 会生成一个 ISO 镜像以将 Cloud-Init 数据传递给虚拟机。为此,所有的 Cloud-Init 虚拟机都需要分配一个 CD-ROM 驱动器。通常,应当添加并使用串行控制台作为显示器。许多 Cloud-Init 镜像依赖于此,这是 OpenStack 的一个要求。然而,其他镜像可能无法适用此配置。如果使用串行控制台不起作用,请切回默认的显示配置。

准备 Cloud-Init 模板

第一步是准备你的虚拟机。基本上你可以使用任何虚拟机。只需在你想要准备的虚拟机*内部*安装Cloud-Init包。在基于Debian/Ubuntu的系统上,这个操作简单到如下所示:

apt-get install cloud-init
Warning
这个命令*不*是为了在 {pve} 主机上执行,而是仅在虚拟机内部执行。

已有许多发行版提供了现成的Cloud-Init镜像(以`.qcow2`文件形式提供),因此,您也可以简单地下载并导入此类镜像。在接下来的例子中,我们将使用由Ubuntu在https://cloud-images.ubuntu.com提供的云镜像。

# download the image
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

# create a new VM with VirtIO SCSI controller
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci

# import the downloaded disk to the local-lvm storage, attaching it as a SCSI drive
qm set 9000 --scsi0 local-lvm:0,import-from=/path/to/bionic-server-cloudimg-amd64.img
Note
Ubuntu Cloud-Init镜像要求SCSI驱动器使用`virtio-scsi-pci`控制器类型。
添加 Cloud-Init CD-ROM 驱动器

下一步是配置一个CD-ROM驱动器,它将用于将Cloud-Init数据传递给虚拟机。

qm set 9000 --ide2 local-lvm:cloudinit

为了能够直接从Cloud-Init镜像启动,设置`boot`参数为`order=scsi0`以限制BIOS仅从此硬盘启动。这将加快启动速度,因为VM BIOS会跳过测试可启动CD-ROM的步骤。

qm set 9000 --boot order=scsi0

对于许多Cloud-Init镜像,需要配置串行控制台并使用它作为显示器。如果配置对给定的镜像不起作用,那么切换回默认显示器。

qm set 9000 --serial0 socket --vga serial0

在最后一步中,将虚拟机转换成模板是很有帮助的。从这个模板你可以快速创建链接克隆。从虚拟机模板部署比创建一个完整的克隆(拷贝)要快得多。

qm模版 9000

部署云初始化模板

你可以通过克隆来轻松部署这样一个模板:

qm clone 9000 123 --name ubuntu2

然后配置用于认证的SSH公钥,并配置IP设置:

qm set 123 --sshkey ~/.ssh/id_rsa.pub
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1

您也可以仅使用一个命令配置所有Cloud-Init选项。我们只是将上述示例分开,以分离命令来减少行长度。另外,请确保根据您的特定环境调整IP设置。

自定义 Cloud-Init 配置

Cloud-Init集成还允许使用自定义配置文件代替自动生成的配置。这是通过命令行上的`cicustom`选项来完成的:

qm set 9000 --cicustom "user=<volume>,network=<volume>,meta=<volume>"

自定义配置文件必须存储在支持片段的存储上,并且必须在虚拟机将要迁移到的所有节点上可用。否则,虚拟机将无法启动。例如:

qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"

Cloud-Init 有三种配置类型。第一种是上面示例中看到的 user 配置。第二种是 network 配置,第三种是 meta 配置。它们可以一起指定,或者根据需要混合和匹配。对于没有指定自定义配置文件的配置,将使用自动生成的配置。

生成的配置可以被转储,用作自定义配置的基础:

qm cloudinit dump 9000 user

相同的命令也适用于`network`和`meta`。

Cloud-Init特定选项

cicustom`: `[meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]

指定自定义文件以在启动时替换自动生成的文件。

meta`=`<volume>

指定一个自定义文件,包含通过cloud-init传递给虚拟机的所有元数据。这是特定于提供商的,意味着configdrive2和nocloud是有区别的。

network`=`<volume>

通过 cloud-init 将包含所有网络数据的自定义文件传递给虚拟机。

user`=`<volume>

通过 cloud-init 将包含所有用户数据的自定义文件传递给虚拟机。

vendor`=`<volume>

通过cloud-init将包含所有供应商数据的自定义文件传递给VM。

cipassword`: `<string>

要分配给用户的密码。通常不建议使用这种方法,请改用ssh密钥。还要注意,较旧版本的cloud-init不支持哈希密码。

citype`: `<configdrive2 | nocloud | opennebula>

指定云初始化配置格式。默认值取决于配置的操作系统类型(ostype)。我们对于Linux使用`nocloud`格式,对于Windows使用`configdrive2`格式。

ciupgrade`: <boolean> ('default =' 1)

在第一次启动后执行自动包升级。

ciuser`: `<string>

用于更改SSH密钥和密码的用户名,而不是镜像配置的默认用户。

ipconfig[n]`: `[gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]

为相应接口指定IP地址和网关。

IP地址使用CIDR表示法,网关是可选的,但需要指定相同类型的IP地址。

特殊字符串’dhcp’可用于IP地址以使用DHCP,在这种情况下不应提供明确的网关。对于IPv6,特殊字符串’auto’可用于使用无状态自动配置。这需要cloud-init 19.4或更新版本。

如果启用了cloud-init,并且既没有指定IPv4地址也没有指定IPv6地址,它将默认使用IPv4上的dhcp。

gw`=`<GatewayIPv4>

IPv4流量的默认网关。

Note
需要选项: `ip
gw6`=`<GatewayIPv6>

IPv6流量的默认网关。

Note
需要选项: `ip6
ip`=<IPv4格式/CIDR> ('默认值=' dhcp)

CIDR格式的IPv4地址。

ip6`=<IPv6Format/CIDR> ('default =' dhcp)

IPv6地址的CIDR格式。

nameserver`: `<string>

为容器设置DNS服务器IP地址。如果没有设置searchdomain和nameserver,创建操作会自动使用主机的设置。

searchdomain`:`<字符串>

为容器设置DNS搜索域。如果没有设置searchdomain或nameserver,创建操作将自动使用主机的设置。

sshkeys`: `<string>

设置公共SSH密钥(每行一个密钥,OpenSSH格式)。