16.1.2.2. cloud-init

16.1.2.2.1. 快速

vim /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network: {config: disabled}

#or

echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network:
    version: 2
    renderer: networkd
    ethernets:
        eth0:
            dhcp4: no
            addresses:
                - 10.196.126.21/24
            routes:
                - to: default
                  via: 10.196.126.1
            nameservers:
                addresses:
                - 8.8.8.8
                - 8.8.4.4

16.1.2.2.2. 参考

https://documentation.ubuntu.com/lxd/en/stable-5.21/cloud-init/

16.1.2.2.3. 介绍

cloud-init 是一个用于自动初始化和自定义 Linux 发行版实例的工具。

通过在您的实例中添加 cloud-init 配置,您可以指示 cloud-init 在实例第一次启动时执行特定操作。可能的操作包括:

  • 更新和安装软件包

  • 应用特定配置

  • 添加用户

  • 启用服务

  • 运行命令或脚本

  • 自动将虚拟机的文件系统扩展到磁盘大小

备注

cloud-init 操作仅在实例第一次启动时运行一次。重启实例不会重新触发这些操作。

要使用 cloud-init,您必须基于已安装 cloud-init 的镜像创建实例:

来自 ubuntu 和 ubuntu-daily 镜像服务器的所有镜像都支持 cloud-init。然而,对于 20.04 LTS 之前的 Ubuntu 版本,镜像需要进行特殊处理才能正确集成 cloud-init,以便 lxc exec 可以正常与使用这些镜像的虚拟机配合使用。请参阅 VM cloud-init 文档。

来自 images 远程服务器的镜像有启用 cloud-init 的变体,这些变体通常比默认变体大。cloud 变体使用 /cloud 后缀,例如,images:/edge/cloud。

16.1.2.2.4. 配置选项

LXD 支持两种不同的配置选项集来配置 cloud-init:cloud-init.* 和 user.*。您必须使用哪种配置选项集取决于您使用的镜像对 cloud-init 的支持情况。一般来说,较新的镜像支持 cloud-init.* 配置选项,而较旧的镜像支持 user.*。然而,这条规则也可能有例外。

支持以下配置选项:

  • cloud-init.vendor-data 或 user.vendor-data(参见 Vendor data)

  • cloud-init.user-data 或 user.user-data(参见 User data formats)

  • cloud-init.network-config 或 user.network-config(参见 Network configuration)

16.1.2.2.4.1. Vendor data and user data

vendor-data 和 user-data 都用于向 cloud-init 提供云配置数据。

主要的理念是 vendor-data 用于通用的默认配置,而 user-data 用于实例特定的配置。这意味着您应该在配置文件中指定 vendor-data,而在实例配置中指定 user-data。LXD 不强制执行这种方法,但允许在配置文件和实例配置中同时使用 vendor-data 和 user-data。

如果为一个实例同时提供 vendor-data 和 user-data,cloud-init 会合并这两种配置。然而,如果在两种配置中使用相同的键,合并可能无法进行。在这种情况下,您需要配置 cloud-init 如何合并提供的数据。有关说明,请参阅合并用户数据部分。

16.1.2.2.5. 配置cloud-init

16.1.2.2.5.1. 命令方式

#cloud-config
package_upgrade: true
packages:
- package1
- package2

将上面的yml的内容写入到cloud-init.yml文件中,并使用下面的命令导入:

lxc config set <instance_name> cloud-init.user-data - < cloud-init.yml

16.1.2.2.5.2. API方式

lxc query --request PATCH /1.0/instances/<instance_name> --data '{
"config": {
    "cloud-init.user-data": "#cloud-config\npackage_upgrade: true\npackages:\n  - package1\n  - package2"
}
}'

16.1.2.2.5.3. UI方式

Go to the Configuration tab of the instance detail page and select Advanced > Cloud init. Then click Edit instance and override the configuration for one or more of the cloud-init configuration options.

进入实例详情页面的配置选项卡,选择Advanced > Cloud init。然后点击编辑实例,并覆盖一个或多个 cloud-init 配置选项。

16.1.2.2.6. 检查cloud-init的状态

cloud-init status

如果结果是 status: running,则表示 cloud-init 仍在运行。如果结果是 status: done,则表示它已经完成。

或者,使用 –wait 标志仅在 cloud-init 完成时收到通知。

16.1.2.2.7. 如何指定用户或供应商数据

user-data 和 vendor-data 配置可用于例如升级或安装软件包、添加用户或运行命令。

提供的值必须在第一行指明传递给 cloud-init 的用户数据格式类型。对于升级软件包或设置用户等活动,#cloud-config 是要使用的数据格式。

配置数据存储在实例根文件系统中的以下文件中:

/var/lib/cloud/instance/cloud-config.txt /var/lib/cloud/instance/user-data.txt

16.1.2.2.8. 如何指定网络配置数据

默认情况下,cloud-init 在实例的 eth0 接口上配置一个 DHCP 客户端。您可以使用 network-config 选项定义自己的网络配置,以覆盖默认配置(这是由于模板的结构方式)。

然后,cloud-init 根据 Ubuntu 版本使用 ifupdown 或 netplan 在系统上呈现相关的网络配置。

配置数据存储在实例根文件系统中的以下文件中:

/var/lib/cloud/seed/nocloud-net/network-config /etc/network/interfaces.d/50-cloud-init.cfg(如果使用 ifupdown) /etc/netplan/50-cloud-init.yaml(如果使用 netplan)

16.1.2.2.8.1. 例子

config:
    cloud-init.network-config: |
        version: 1
        config:
        - type: physical
            name: eth1
            subnets:
            - type: static
                ipv4: true
                address: 10.10.101.20
                netmask: 255.255.255.0
                gateway: 10.10.101.1
                control: auto
        - type: nameserver
            address: 10.10.10.254