第 1 章 cloud-init 简介

cloud-init 是一个在系统引导过程中自动初始化云实例的软件包。您可以配置 cloud-init 执行各种任务。cloud-init 可执行的任务示例包括:

  • 配置主机名
  • 在实例上安装软件包
  • 运行脚本
  • 限制默认虚拟机行为

获取镜像进行配置 cloud-init 的位置取决于您打算如何使用它。

  • cloud-init 软件包安装在您从 红帽客户门户网站 载的 KVM 客户机镜像上。当您创建实例时,cloud-init 被启用。从红帽客户门户网站下载的 KVM 客户机镜像适用于 Red Hat Virtualization(RHV)和 Red Hat OpenStack Platform(RHOSP)。您也可以从头开始为 RHV 和 RHOSP 创建镜像。
  • 另一个选择是从红帽客户门户网站下载 ISO 镜像或创建 ISO 镜像。在这种情况下,您需要在您的 ISO 镜像上安装 cloud-init
  • 如果要将镜像与云供应商搭配使用(例如 AWS 或 Azure),请使用 Red Hat Image Builder 创建镜像。镜像构建器镜像是为特定云供应商自定义的。镜像类型 AMI、VHD 和 qcow2 都安装了 cloud-init 。有关镜像构建器的信息,请参阅生成自定义 RHEL 系统镜像

大部分云平台都支持 cloud-init,但配置流程和支持的选项可能会有所不同。另外,您也可以为 NoCloud 环境配置 cloud-init

您可以 在一个虚拟机(VM)上配置 cloud-init,然后将该虚拟机用作额外虚拟机或虚拟机集群的模板。

特定的 Red Hat 产品(如 Red Hat Virtualization)记录了配置使用这些产品 cloud-init 的步骤。

本文档引用了 cloud-init 文档。有关 cloud-init 的完整信息,请参考 cloud-init 文档 。

先决条件

其它资源

1.1. cloud-init 配置

cloud-init 使用 YAML 格式的文件说明来执行任务。您可以通过在 YAML 文件提供 cloud-init 要执行的初始配置。当实例启动时,cloud-init 服务启动并搜索并执行说明。第一次引导或者后续引导虚拟机时根据您的 cloud-init 配置完成的任务。

您可以通过在 /etc/cloud/cloud.cfg.d/ 目录中配置 /etc/cloud/cloud.cfg 文件并添加指令来定义任务。

  • cloud.cfg 文件包括指令,比如用于用户访问和验证以及系统信息。

    该文件还包括 cloud-init 的默认和可选模块。模块在三个阶段内按顺序执行,包括 cloud-init 初始化阶段、配置阶段和最终阶段。在 cloud.cfg 文件中,这三个阶段的模块分别列在 cloud_init_modulescloud_config_modulescloud_final_modules 下。

  • cloud.cfg.d 目录中可以添加附加指令 cloud-init。当您向 cloud.cfg.d 目录中添加指令时,通常会将它们添加到名为 *.cfg的 文件中。您需要在文件的顶部包括 #cloud-config

1.2. cloud-init 操作的阶段

cloud-init 在系统引导过程中分五个阶段操作。这些阶段决定是否运行 cloud-init,以及它在哪里找到数据源,以及其他任务。下面总结了这些阶段。

  1. cloud-init 生成(generator)阶段(通过 systemd 服务),决定是否在引导时运行 cloud-init
  2. 在本地(local)阶段,cloud-init 找到本地数据源并应用网络配置。
  3. 在网络(network)阶段,cloud-init 处理用户数据并运行 cloud.cfg 文件中的 cloud_init_modules 下列出的模块 。您可以启用、禁用或添加模块到 cloud_init_modules 部分。
  4. 在配置(config)阶段,cloud-init 运行 cloud.cfg 文件 cloud_config_modules 下列出的模块 。您可以启用、禁用或添加模块到这个 cloud_config_modules 部分。
  5. 在最后(final)阶段,cloud-init 可以运行 cloud.cfg 文件 cloud_final_modules 中包含的内容。您可以包括通常在系统引导后运行的软件包安装,也可以包括配置管理插件和用户脚本。您可以启用、禁用或添加模块到 cloud_final_modules 部分。

五个引导阶段的信息包括在 cloud-init 文档部分 引导阶段

1.3. cloud-init 模块在阶段执行

cloud-init 运行时,它会在包括网络阶段(cloud_init_modules)、配置阶段(cloud_config_modules)和最终阶段(cloud_final_modules)的三个阶段中按顺序执行 cloud.cfg 中的模块。当首次在虚拟机上运行 cloud-init 时,您配置的所有模块都在相应的阶段中运行。在之后的 cloud-init 运行中,某个模块是否在一个阶段中运行取决于单独模块中的模块频率。有些模块在每次运行 cloud-init 时都会运行,一些模块只运行第一次运行 cloud-init 时运行,即使实例 ID 发生了变化。

注意

用于唯一标识实例的实例 ID。当实例 ID 改变时,cloud-init 把实例看作为一个新实例。

下面是对模块频率值的简单描述。

  • Per instance 意味着该模块在实例的首次引导时运行。例如,如果您克隆实例或从保存的镜像创建新实例,则为每个实例指定的模块再次运行。
  • Per once 表示该模块只运行一次。例如,如果您克隆实例或从保存的镜像创建新实例,指定为 “Per once” 的实例不会在这些实例上再次运行。
  • Per always 意味着该模块在每次引导时都运行。
注意

您可在配置模块时或使用命令行覆盖模块频率的设置。

1.4. cloud-init 使用用户数据、元数据和厂商数据

cloud-init 对用户数据、元数据和厂商数据消耗和动作。

  • 用户数据包括您在 cloud.cfg 文件和 cloud.cfg.d 目录中指定的指令,例如:用户数据可以包括要运行的文件、要安装的软件包和 shell 脚本。如需与 cloud-init 允许的用户数据类型相关的信息,请参阅 cloud-init 文档 User-Data Formats
  • 元数据包括与特定数据源关联的数据,例如:元数据可以包括服务器名称和实例 ID。如果您使用的是特定的云平台,平台会决定实例在哪里查找用户数据和元数据。您的平台可能需要将元数据和用户数据添加到 HTTP 服务中 ; 在这种情况下, cloud-init 运行会消耗 HTTP 服务中的元数据和用户数据。
  • 厂商数据由机构提供(例如云供应商),其中包含可自定义镜像的信息以更好地适合镜像运行环境。cloud-init 在读取任何元数据并初始化系统后,使用可选厂商数据和用户数据进行操作。默认情况下,厂商数据会在第一次引导时运行。您可以禁用厂商数据执行。

    如需元数据的信息,请参阅 cloud-init 文档Instance Metadata;如需数据源的列表,请参阅 Datasources;如需厂商数据的信息,请参阅 Vendor Data

1.5. cloud-init 标识云平台

cloud-init 尝试使用该脚本 ds-identify 识别云平台。该脚本在一个实例第一次引导时运行。

添加数据源指令可在 cloud-init 运行时节省时间。您可以在 /etc/cloud/cloud.cfg 文件或 /etc/cloud/cloud.cfg.d 目录中添加该指令。下面是一个示例。

datasource_list:[Ec2]

除了为云平台添加此指令外,您还可以通过添加额外的配置详情,如元数据 URL 来进一步配置 cloud-init

datasource_list: [Ec2]
datasource:
  Ec2:
    metadata_urls: ['http://169.254.169.254']

cloud-init 运行后,您可以查看有关该平台的详细信息的日志文件(run/cloud-init/ds-identify.log)。