7.9. 使用 Cloud-Init 自动配置虚拟机

Cloud-Init 是自动化虚拟机的初始设置(如配置主机名、网络接口和授权密钥)的工具。在调配基于模板部署的虚拟机时,可以使用它,以避免网络上冲突。

要使用此工具,必须先在虚拟机上安装 cloud-init 软件包。安装后,Cloud-Init 服务将在引导过程中启动,以搜索有关配置对象的指令。然后,您可以使用 Run Once 窗口中的选项仅提供这些指令一次,或者使用 New Virtual MachineEdit Virtual MachineEdit Template 窗口中的选项在每次虚拟机启动时提供这些指令。

注意

或者,您可以使用 Ansible, Python, Java, 或 Ruby 配置 Cloud-Init

7.9.1. Cloud-Init 用例

Cloud-Init 可用于在各种情况下自动执行虚拟机配置。以下是几个常见情况:

  • 基于模板创建的虚拟机

    您可以使用 Run Once 窗口的 Initial Run 部分中的 Cloud-Init 选项来初始化基于模板创建的虚拟机。这样,您可以在虚拟机首次启动时自定义虚拟机。

  • 虚拟机模板

    您可以使用 Edit Template 窗口的 Initial Run 选项卡中的 Use Cloud-Init/Sysprep 选项来指定用于自定义基于该模板创建的虚拟机的选项。

  • 虚拟机池

    您可以使用 新建池 窗口上 Initial Run 选项卡中的 Use Cloud-Init/Sysprep 选项指定自定义从该虚拟机池中获取的虚拟机的选项。这样,您可以指定一组标准设置,每次从该虚拟机池中获取虚拟机时都将应用这些设置。您可以继承或覆盖为虚拟机所基于的模板指定的选项,或者指定虚拟机池本身的选项。

7.9.2. 安装 Cloud-Init

这个步骤描述了如何在虚拟机上安装 Cloud-Init。安装了 Cloud-Init 后,您可以基于此虚拟机创建模板。基于此模板创建的虚拟机可以利用 Cloud-Init 功能,如配置主机名、时区、root 密码、授权密钥、网络接口、DNS 服务等。

安装 Cloud-Init

  1. 登录虚拟机。
  2. 启用存储库:

    • Red Hat Enterprise Linux 6:

      # subscription-manager repos \
          --enable=rhel-6-server-rpms \
          --enable=rhel-6-server-rh-common-rpms
    • Red Hat Enterprise Linux 7:

      # subscription-manager repos \
          --enable=rhel-7-server-rpms \
          --enable=rhel-7-server-rh-common-rpms
    • 对于 Red Hat Enterprise Linux 8,您通常不需要启用软件仓库来安装 Cloud-Init。Cloud-Init 软件包是 AppStream repo rhel-8-for-x86_64-appstream-rpms 的一部分,该仓库在 Red Hat Enterprise Linux 8 中默认启用。
  3. 安装 cloud-init 软件包和依赖项:

    # dnf install cloud-init
    注意

    对于早于 Red Hat Enterprise Linux 8 的版本,请使用 yum install cloud-init 命令,而不是 dnf install cloud-init

7.9.3. 使用 Cloud-Init 准备模板

只要在 Linux 虚拟机上安装了 cloud-init 软件包,就可以使用该虚拟机来生成启用了 cloud-init 的模板。指定要包含在模板中的一组标准设置,如以下步骤所述,或者跳过 Cloud-Init 设置步骤,并在基于此模板创建虚拟机时进行配置。

注意

以下流程概述了如何在准备模板时使用 Cloud-Init,但在 New Virtual MachineEdit TemplateRun Once 窗口中也提供了相同的设置。

使用 Cloud-Init 准备模板

  1. 单击 ComputeTemplates 并选择模板。
  2. Edit
  3. 单击 Show Advanced Options
  4. 单击 Initial Run 选项卡,再选中 Use Cloud-Init/Sysprep 复选框。
  5. VM Hostname 文本 字段中输入主机名。
  6. 选择 Configure Time Zone 复选框,然后从 Time Zone 下拉列表中选择一个时区。
  7. 展开 Authentication 部分。

    • 选中 Use already configure password 复选框以使用现有凭据,或者清除该复选框并在 PasswordVerify Password 文本字段中输入 root 密码以指定新的 root 密码。
    • SSH 授权密钥文本区域中,输入要添加到虚拟机上授权主机文件的任何 SSH 密钥。
    • 选中 Regenerate SSH Keys 复选框,为虚拟机重新生成 SSH 密钥。
  8. 展开 Networks 部分。

    • DNS Servers 文本字段中,输入任何 DNS 服务器。
    • DNS Search Domains 文本字段中,输入任何 DNS 搜索域。
    • 选择 In-guest Network Interface 复选框,然后使用 + Add new- Renove selected 按钮向虚拟机中添加或删除网络接口。

      重要

      您必须指定正确的网络接口名称和编号(如 eth0,eno3enp0s)。否则,虚拟机的接口连接将启动,但不含 cloud-init 网络配置。

  9. 展开 Custom Script 部分,然后在 Custom Script 文本区域中输入任何自定义脚本。
  10. 点击 确定

您现在可以使用此模板调配新的虚拟机。

7.9.4. 使用 Cloud-Init 初始化虚拟机

使用 Cloud-Init 自动执行 Linux 虚拟机的初始配置。您可以使用 Cloud-Init 字段配置虚拟机的主机名、时区、root 密码、授权密钥、网络接口和 DNS 服务。您还可以指定要在启动时运行的自定义脚本(YAML 格式的脚本)。自定义脚本允许 Cloud-Init 支持但 Cloud-Init 字段中不支持的额外 Cloud-Init 配置。有关自定义脚本示例的更多信息,请参阅云配置示例

使用 Cloud-Init 初始化虚拟机

此流程使用一组 Cloud-Init 设置启动虚拟机。如果模板中包含相关的设置,请检查虚拟机的设置,并根据需要进行修改,然后单击 确定 以启动虚拟机。

  1. 单击 ComputeVirtual Machines 并选择虚拟机。
  2. 单击 Run 下拉菜单,再选择 Run Once
  3. 展开 Initial Run 部分,再选中 Cloud-Init 复选框。
  4. VM Hostname 文本 字段中输入主机名。
  5. 选择 Configure Time Zone 复选框,然后从 Time Zone 下拉菜单中选择一个时区。
  6. 选中 Use already configure password 复选框以使用现有凭据,或者清除该复选框并在 PasswordVerify Password 文本字段中输入 root 密码以指定新的 root 密码。
  7. SSH 授权密钥文本区域中,输入要添加到虚拟机上授权主机文件的任何 SSH 密钥。
  8. 选中 Regenerate SSH Keys 复选框,为虚拟机重新生成 SSH 密钥。
  9. DNS Servers 文本字段中,输入任何 DNS 服务器。
  10. DNS Search Domains 文本字段中,输入任何 DNS 搜索域。
  11. 选中 Network 复选框,再使用 +- 按钮向虚拟机中添加或删除网络接口。

    重要

    您必须指定正确的网络接口名称和编号(如 eth0,eno3enp0s)。否则,虚拟机的接口连接将启动,但不会在其中定义 cloud-init 网络配置。

  12. Custom Script 文本区域中输入自定义脚本。确保脚本中指定的值合适。否则,操作将失败。
  13. 点击 确定
注意

若要检查虚拟机是否安装了 Cloud-Init,请选择虚拟机并单击 Applications 子选项卡。仅在安装了客户机代理时才显示。