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`控制器类型。 |
下一步是配置一个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格式)。