如何使用 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-init
:cloud-init.*
和 user.*
。您必须使用哪种配置选项集取决于您使用的镜像中的 cloud-init
支持。作为经验法则,较新的镜像支持 cloud-init.*
配置选项,而较旧的镜像支持 user.*
。但是,该规则可能存在例外情况。
支持以下配置选项
cloud-init.vendor-data
或user.vendor-data
(参见 供应商数据)cloud-init.user-data
或user.user-data
(参见 用户数据格式)cloud-init.network-config
或user.network-config
(参见 网络配置)
有关配置选项的更多信息,请参见 cloud-init
实例选项,以及 LXD 数据源 的文档 在 cloud-init
文档中。
供应商数据和用户数据¶
两者 vendor-data
和 user-data
用于向 cloud-init
提供 云配置数据。
主要思想是 vendor-data
用于一般的默认配置,而 user-data
用于特定于实例的配置。这意味着您应该在配置文件中指定 vendor-data
,并在实例配置中指定 user-data
。Incus 不强制执行这种方法,而是允许在配置文件和实例配置中同时使用 vendor-data
和 user-data
。
如果实例同时提供 vendor-data
和 user-data
,cloud-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-data
和 user-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-data
和 vendor-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
然后使用 ifupdown
或 netplan
在系统上呈现相关的网络配置,具体取决于 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