第 12 章 创建自定义实例

云用户可以指定在启动实例时要使用的额外数据,如实例在引导时运行的 shell 脚本。云用户可以使用以下方法将数据传递给实例:

用户数据
使用 在实例启动命令中包含要执行的 cloud-init 的说明。
实例元数据
创建或更新实例时可以指定的键值对列表。

您可以使用配置驱动器或元数据服务访问传递给实例的额外数据。

配置驱动器
您可以在启动时将配置驱动器附加到实例。将配置驱动器作为只读驱动器提供给实例。实例可以挂载此驱动器并从中读取文件。您可以使用 config 驱动器作为 cloud-init 信息的来源。当与 cloud-init 结合使用以进行服务器 bootstrap 时,配置驱动器很有用,以及您想要将大型文件传递给您的实例时非常有用。例如,您可以将 cloud-init 配置为自动挂载配置驱动器,并在初始实例引导期间运行设置脚本。使用 config-2 的卷标签创建配置驱动器,并在引导时附加到实例。传递给配置驱动器的任何额外文件的内容都添加到配置驱动器的 openstack/{version}/ 目录中的 user_data 文件中。cloud-init 从此文件检索用户数据。
元数据服务
提供 REST API 来检索特定于实例的数据。实例通过 169.254.169.254fe80::a9fe:a9fe 访问此服务。

cloud-init 可以使用配置驱动器和元数据服务来消耗额外的数据来自定义实例。cloud-init 软件包支持多种数据输入格式。Shell 脚本和 cloud-config 格式是最常见的输入格式:

  • Shell 脚本:数据声明以 #!Content-Type: text/x-shellscript 开头。在引导过程中会调用 shell 脚本。
  • cloud-config 格式:数据声明以 #cloud-configContent-Type: text/cloud-config 开头。cloud-config 文件必须是有效的 YAML,才能被 cloud-init 解析并执行。
注意

对于传递到实例的数据,cloud-init 的最大用户数据大小为 16384 字节。您无法更改大小限制,因此当您需要超过大小限制时,请使用 gzip 压缩。

特定于供应商的数据

RHOSP 管理员也可以在创建数据时将数据传递给实例。这些数据可能无法作为云用户可见,例如,将实例注册到 Active Directory 的加密令牌。

RHOSP 管理员使用 vendordata 功能将数据传递给实例。vendordata 配置是只读的,位于以下文件中:

  • /openstack/{version}/vendor_data.json
  • /openstack/{version}/vendor_data2.json

您可以使用元数据服务或实例上的配置驱动器查看这些文件。要使用元数据服务访问文件,请对 http://169.254.169.254/openstack/{version}/vendor_data.jsonhttp://169.254.169.254/openstack/{version}/vendor_data2.json 发出 GET 请求。

12.1. 使用用户数据自定义实例

您可以使用用户数据在 instance launch 命令中包含指令。cloud-init 执行这些命令,以作为引导过程中的最后一步自定义实例。

流程

  1. 创建包含 cloud-init 指令的文件。例如,创建一个 bash 脚本,用于在实例上安装并启用 Web 服务器:

    $ vim /home/scripts/install_httpd
    #!/bin/bash
    
    yum -y install httpd python-psycopg2
    systemctl enable httpd --now
  2. 使用 --user-data 选项启动实例,以传递 bash 脚本:

    $ openstack server create \
    --image rhel8 \
    --flavor default \
    --nic net-id=web-server-network \
    --security-group default \
    --key-name web-server-keypair \
    --user-data /home/scripts/install_httpd \
    --wait web-server-instance
  3. 当实例状态为 active 时,附加一个浮动 IP 地址:

    $ openstack floating ip create web-server-network
    $ openstack server add floating ip web-server-instance 172.25.250.123
  4. 使用 SSH 登录实例:

    $ ssh -i ~/.ssh/web-server-keypair cloud-user@172.25.250.123
  5. 检查自定义是否已成功执行。例如,要检查 web 服务器是否已安装并启用,请输入以下命令:

    $ curl http://localhost | grep Test
    <title>Test Page for the Apache HTTP Server on Red Hat Enterprise Linux</title>
    <h1>Red Hat Enterprise Linux <strong>Test Page</strong></h1>
  6. 查看 /var/log/cloud-init.log 文件,以了解相关消息,如 cloud-init 是否执行:

    $ sudo less /var/log/cloud-init.log
    ...output omitted...
    ...util.py[DEBUG]: Cloud-init v. 0.7.9 finished at Sat, 23 Jun 2018 02:26:02 +0000. Datasource DataSourceOpenStack [net,ver=2].  Up 21.25 seconds