第 11 章 创建自定义实例


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

用户数据
使用 在 instance launch 命令中包含指令,以便 cloud-init 用于执行。
实例元数据
创建或更新实例时可以指定的键值对列表。

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

配置驱动器
您可以在启动时将配置驱动器附加到实例。配置驱动器以只读驱动器的形式呈现给实例。实例可以挂载此驱动器并从中读取文件。您可以使用配置驱动器作为 cloud-init 信息的来源。配置驱动器在与用于服务器引导的 cloud-init 结合使用时,以及您要将大型文件传递给您的实例时很有用。例如,您可以将 cloud-init 配置为自动挂载配置驱动器,并在初始实例引导过程中运行设置脚本。创建配置驱动器时带有 config-2 的卷标签,并在引导时附加到实例。传递给配置驱动器的任何其他文件的内容添加到 config 驱动器的 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 请求。

注意

要在云上执行 openstack 客户端命令,您必须指定 clouds.yaml 文件中详述的云名称。您可以使用以下方法之一指定云的名称:

  • 在每个命令中使用 --os-cloud 选项,例如:

    $ openstack flavor list --os-cloud <cloud_name>
    Copy to Clipboard Toggle word wrap

    如果您访问多个云,则使用此选项。

  • bashrc 文件中为云名称创建一个环境变量:

    `export OS_CLOUD=<cloud_name>`
    Copy to Clipboard Toggle word wrap

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

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

先决条件

  • 管理员已为您创建一个项目,并为您提供了一个 clouds.yaml 文件来访问云。
  • 已安装 python-openstackclient 软件包。

流程

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

    $ vim /home/scripts/install_httpd
    #!/bin/bash
    
    yum -y install httpd python-psycopg2
    systemctl enable httpd --now
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  3. 当实例状态变为 active 时,附加一个浮动 IP 地址:

    $ openstack floating ip create web-server-network
    $ openstack server add floating ip web-server-instance 172.25.250.123
    Copy to Clipboard Toggle word wrap
  4. 使用 SSH 登录实例:

    $ ssh -i ~/.ssh/web-server-keypair cloud-user@172.25.250.123
    Copy to Clipboard Toggle word wrap
  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>
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat