如何使用 cloud-init

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

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

  • 更新和安装软件包

  • 应用某些配置

  • 添加用户

  • 启用服务

  • 运行命令或脚本

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

有关详细信息,请参见Cloud-init 文档

注意

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

cloud-init 镜像支持

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

来自 images 远程 的镜像具有 cloud-init 启用的变体,这些变体通常比默认变体更大。云变体使用 /cloud 后缀,例如,images:ubuntu/22.04/cloud

cloud-init 和虚拟机

为了使 cloud-init 在虚拟机内部工作,您需要在 VM 中拥有一个功能正常的 incus-agent,或者需要通过一个特殊的额外磁盘提供 cloud-init 数据。来自 images: 远程的所有镜像都将预先设置代理,因此从一开始就可以正常使用。

对于没有 incus-agent 的实例,您可以通过以下方式传入额外的 cloud-init 磁盘:

incus config device add INSTANCE cloud-init disk source=cloud-init:config

配置选项

Incus 支持两种不同的配置选项集来配置 cloud-initcloud-init.*user.*。您必须使用哪种配置选项集取决于您使用的镜像中的 cloud-init 支持。作为经验法则,较新的镜像支持 cloud-init.* 配置选项,而较旧的镜像支持 user.*。但是,该规则可能存在例外情况。

支持以下配置选项

有关配置选项的更多信息,请参见 cloud-init 实例选项,以及 LXD 数据源 的文档 在 cloud-init 文档中。

供应商数据和用户数据

两者 vendor-datauser-data 用于向 cloud-init 提供 云配置数据

主要思想是 vendor-data 用于一般的默认配置,而 user-data 用于特定于实例的配置。这意味着您应该在配置文件中指定 vendor-data,并在实例配置中指定 user-data。Incus 不强制执行这种方法,而是允许在配置文件和实例配置中同时使用 vendor-datauser-data

如果实例同时提供 vendor-datauser-datacloud-init 会将这两个配置合并。但是,如果在两个配置中使用相同的键,则合并可能无法进行。在这种情况下,请配置 cloud-init 如何合并提供的数据。有关说明,请参见 合并用户数据部分

如何配置 cloud-init

要为实例配置 cloud-init,请将相应的配置选项添加到实例使用的 配置文件 或直接添加到 实例配置 中。

当直接为实例配置 cloud-init 时,请记住 cloud-init 仅在实例第一次启动时运行。这意味着您必须在启动实例之前配置 cloud-init。为此,请使用 incus init 创建实例,而不是使用 incus launch,然后在完成配置后启动实例。

用于 cloud-init 配置的 YAML 格式

cloud-init 选项需要 YAML 的 字面量格式。使用管道符号 (|) 表示管道后的所有缩进文本都应作为单个字符串传递给 cloud-init,并保留换行符和缩进。

vendor-datauser-data 选项通常以 #cloud-config 开头。

例如

config:
  cloud-init.user-data: |
    #cloud-config
    package_upgrade: true
    packages:
      - package1
      - package2

提示

有关如何检查语法是否正确的更多信息,请参见 如何验证用户数据

如何检查 cloud-init 状态

cloud-init 会在实例第一次启动时自动运行。根据配置的操作,它可能需要一段时间才能完成。

要检查 cloud-init 状态,请登录到实例并输入以下命令

cloud-init status

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

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

root@instance:~# cloud-init status --wait
.....................................status: done

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

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

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

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

  • /var/lib/cloud/instance/cloud-config.txt

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

示例

有关不同示例用例的用户数据(或供应商数据)配置,请参见以下部分。

您可以在 cloud-init 文档中找到更多高级的 示例

升级软件包

要从实例创建后立即从存储库中触发实例的软件包升级,请使用 package_upgrade

config:
  cloud-init.user-data: |
    #cloud-config
    package_upgrade: true

安装软件包

要在设置实例时安装特定软件包,请使用 packages 键并将软件包名称指定为列表

config:
  cloud-init.user-data: |
    #cloud-config
    packages:
      - git
      - openssh-server

设置时区

要在实例创建时为实例设置时区,请使用 timezone

config:
  cloud-init.user-data: |
    #cloud-config
    timezone: Europe/Rome

运行命令

要运行命令(例如写入标记文件),请使用 runcmd 键并将命令指定为列表

config:
  cloud-init.user-data: |
    #cloud-config
    runcmd:
      - [touch, /run/cloud.init.ran]

添加用户帐户

要添加用户帐户,请使用 users 键。有关默认用户以及支持哪些键的详细信息,请参见 cloud-init 文档中的 包含用户和组 示例。

config:
  cloud-init.user-data: |
    #cloud-config
    users:
      - name: documentation_example

如何指定网络配置数据

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

cloud-init 然后使用 ifupdownnetplan 在系统上呈现相关的网络配置,具体取决于 Ubuntu 版本。

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

  • /var/lib/cloud/seed/nocloud-net/network-config

  • /etc/network/interfaces.d/50-cloud-init.cfg(如果使用 ifupdown

  • /etc/netplan/50-cloud-init.yaml(如果使用 netplan

示例

要配置具有静态 IPv4 地址的特定网络接口,并使用自定义名称服务器,请使用以下配置

config:
  cloud-init.network-config: |
    version: 2
    ethernets:
      eth1:
        addresses:
          - 10.10.101.20/24
        gateway4: 10.10.101.1
        nameservers:
          addresses:
            - 10.10.10.254