第 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.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 请求。
要在云上执行 openstack
客户端命令,您必须指定 clouds.yaml
文件中详述的云名称。您可以使用以下方法之一指定云的名称:
在每个命令中使用
--os-cloud
选项,例如:openstack flavor list --os-cloud <cloud_name>
$ openstack flavor list --os-cloud <cloud_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您访问多个云,则使用此选项。
在
bashrc
文件中为云名称创建一个环境变量:`export OS_CLOUD=<cloud_name>`
`export OS_CLOUD=<cloud_name>`
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.1. 使用用户数据自定义实例 复制链接链接已复制到粘贴板!
您可以使用用户数据在 instance launch 命令中包含指令。cloud-init
执行这些命令,以作为引导过程中的最后一步自定义实例。
先决条件
-
管理员已为您创建一个项目,并为您提供了一个
clouds.yaml
文件来访问云。 -
已安装
python-openstackclient
软件包。
流程
创建包含
cloud-init
指令的文件。例如,创建一个 bash 脚本,用于在实例上安装并启用 Web 服务器:vim /home/scripts/install_httpd
$ vim /home/scripts/install_httpd #!/bin/bash yum -y install httpd python-psycopg2 systemctl enable httpd --now
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
-user-data
选项启动实例,以传递 bash 脚本:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当实例状态变为 active 时,附加一个浮动 IP 地址:
openstack floating ip create web-server-network openstack server add floating ip web-server-instance 172.25.250.123
$ openstack floating ip create web-server-network $ openstack server add floating ip web-server-instance 172.25.250.123
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 SSH 登录实例:
ssh -i ~/.ssh/web-server-keypair cloud-user@172.25.250.123
$ ssh -i ~/.ssh/web-server-keypair cloud-user@172.25.250.123
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查已成功执行自定义。例如,要检查 web 服务器是否已安装并启用,请输入以下命令:
curl http://localhost | grep Test
$ 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 Copied! Toggle word wrap Toggle overflow 查看
/var/log/cloud-init.log
文件中的相关信息,如cloud-init
是否执行:sudo less /var/log/cloud-init.log
$ 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 Copied! Toggle word wrap Toggle overflow