第 11 章 创建自定义实例
云用户可以指定在启动实例时要使用的额外数据,如实例在引导时运行的 shell 脚本。云用户可以使用以下方法将数据传递给实例:
- 用户数据
-
使用 在实例启动命令中包含要执行的
cloud-init
的说明。 - 实例元数据
- 创建或更新实例时可以指定的键值对列表。
您可以使用配置驱动器或元数据服务访问传递给实例的额外数据。
- 配置驱动器
-
您可以在启动时将配置驱动器附加到实例。将配置驱动器作为只读驱动器提供给实例。实例可以挂载此驱动器并从中读取文件。您可以使用 config 驱动器作为
cloud-init
信息的来源。当与cloud-init
结合使用以进行服务器 bootstrap 时,配置驱动器很有用,以及您想要将大型文件传递给您的实例时非常有用。例如,您可以将cloud-init
配置为自动挂载配置驱动器,并在初始实例引导期间运行设置脚本。使用config-2
的卷标签创建配置驱动器,并在引导时附加到实例。传递给配置驱动器的任何额外文件的内容都添加到配置驱动器的openstack/{version}/
目录中的user_data
文件中。cloud-init
从此文件检索用户数据。 - 元数据服务
-
提供 REST API 来检索特定于实例的数据。实例通过
169.254.169.254
或fe80::a9fe:a9fe
访问此服务。
cloud-init
可以使用配置驱动器和元数据服务来消耗额外的数据来自定义实例。cloud-init
软件包支持多种数据输入格式。Shell 脚本和 cloud-config
格式是最常见的输入格式:
-
Shell 脚本:数据声明以
#!
或Content-Type: text/x-shellscript
开头。在引导过程中会调用 shell 脚本。 -
cloud-config
格式:数据声明以#cloud-config
或Content-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.json
或 http://169.254.169.254/openstack/{version}/vendor_data2.json
发出 GET 请求。
11.1. 使用用户数据自定义实例
您可以使用用户数据在 instance launch 命令中包含指令。cloud-init
执行这些命令,以作为引导过程中的最后一步自定义实例。
流程
创建包含
cloud-init
指令的文件。例如,创建一个 bash 脚本,用于在实例上安装并启用 Web 服务器:$ vim /home/scripts/install_httpd #!/bin/bash yum -y install httpd python-psycopg2 systemctl enable httpd --now
使用
--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
当实例状态为 active 时,附加一个浮动 IP 地址:
$ openstack floating ip create web-server-network $ openstack server add floating ip web-server-instance 172.25.250.123
使用 SSH 登录实例:
$ ssh -i ~/.ssh/web-server-keypair cloud-user@172.25.250.123
检查自定义是否已成功执行。例如,要检查 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>
查看
/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