为 Terraform 部署配置虚拟机映像

本文介绍了如何使用 Terraform 完成配置并提交虚拟机映像以进行部署。

确定如何创建部署包

我们建议您使用 Producer Portal 的引导式配置选项直接在 Google Cloud 控制台中创建部署包。

引导式配置选项支持简单的虚拟机产品,例如具有基本防火墙规则的单虚拟机部署,但不支持一些复杂功能,例如具有多个虚拟机和非计算资源的部署。如果您需要引导式配置不支持的功能,可以使用手动配置选项创建部署软件包,或通过添加其他功能来自定义现有软件包。

在引导式配置和手动配置之间切换

如果您使用的是 Producer Portal 的引导式配置选项,并且稍后想切换为手动配置部署包,请点击 Go tomanual configuration

完成引导式配置

如需使用 Google Cloud 控制台完成配置并提交简单部署包,请完成以下步骤:

  1. 在 Producer Portal 中,前往 Deployment package(部署包)部分。

  2. Terraform 配置下,在标有 Cloud Storage 存储分区的输入字段旁边,点击浏览

    如果您已创建 Cloud Storage 存储桶,请在此处选择该存储分区。

    如果您没有 Cloud Storage 存储桶,请点击标记为创建新存储桶的图标。创建新存储桶时,您需要执行以下操作:

    • 为存储桶选择名称。

    • 指定存储桶在其中存储数据的一个或多个区域。

    • 指定数据的存储类别。

    • 确定要应用于存储桶数据的 Identity and Access Management (IAM) 权限的精细程度。

    • 配置可选的高级设置,例如加密或数据保留政策。

  3. 确保为 Cloud Storage 存储桶启用对象版本控制

  4. 如需保存存储桶设置并继续配置部署包,请点击配置

  5. 选择机器类型下,您必须为虚拟机产品指定默认地区最小机器类型默认机器类型,以及其启动磁盘的大小和类型。

  6. 指定操作系统下,您必须指定虚拟机映像使用的操作系统的名称和版本,以及虚拟机映像的版本号。

  7. 或者,在设置虚拟机访问权限下,您可以指定网站、管理员网址以及用户名和密码,以供用户在部署后用于访问虚拟机。

  8. (可选)在配置网络下,您可以指定 IP 转发的设置并配置防火墙规则。

  9. (可选)在定义后续步骤下,您可以为产品用户提供说明,以指导他们开始使用该产品。在部署您的产品后,他们可以看到这些说明。

  10. 完成上述步骤后,点击 Generate 以创建部署包。

    如果您稍后需要对部署包进行其他更改,可以点击修改进行更改,然后点击生成,以重新生成部署包并应用这些更改。

  11. 在 Producer Portal 中验证部署包。

  12. 在 Cloud Marketplace 成功完成对部署包的验证后,点击发布以开始测试您的部署包。

完成手动配置

本部分介绍如何使用手动配置选项创建部署包并提交软件包以供审核。

指定使用默认还是自定义 Terraform 模块

您可以选择希望客户在部署产品时使用默认或自定义 Terraform 模块。

如果您选择使用默认的 Terraform 模块,Google Cloud 会为客户提供自动生成的 Terraform 代码,供他们用于部署产品。

如果您选择使用自定义 Terraform 模块,则必须向客户提供您自己的 Terraform 模板。您可以选择以客户可使用命令行界面 (CLI) 部署的形式提供这些模板,或采用可让客户直接从 Cloud Marketplace 部署模块的其他元数据形式提供这些模板。

如需指定您的客户应使用默认还是自定义 Terraform 模块,以及您希望客户如何部署该模块(对于自定义 Terraform 模块),请完成以下步骤:

  1. 在 Producer Portal 中,前往 Deployment package(部署包)部分。

  2. Terraform 配置下的类型下,选择默认自定义(CLI 部署)自定义(界面部署)

自定义 Terraform 模块的要求

如果您选择使用自定义 Terraform 模块,您的自定义模块必须满足以下要求:

  • 您的自定义模块必须具有可供 Cloud Marketplace 验证其是否符合要求的模块。如需了解详情,请参阅测试您的模块是否通过验证

  • 您的模块必须具有一个名为 project_id 的变量,用于存储客户用于部署模块的项目 ID。

  • 您必须采用 projects/PROJECT_NAME/global/images/IMAGE_NAME 格式将对映像名称的引用指定为 Terraform 变量。必须将 default 的值设置为虚拟机映像的名称,以便 Cloud Marketplace 拥有的映像副本可以在发布虚拟机产品时替换到模块中。

  • 您的模块不得依赖于未封装到的外部模块。

  • 您的模块只能使用以下已获批准的提供方:

    • archive
    • cloud-init
    • dns
    • google
    • google-beta
    • http
    • null
    • random
    • time
    • tls

如需查看符合这些要求的自定义模块示例,请访问自定义 Terraform 模块示例

针对界面部署的自定义 Terraform 模块的其他要求

如果您的自定义模块支持界面部署,则还必须满足以下额外要求:

  • 您的模块必须包含一个名为 goog_cm_deployment_name 的变量。Cloud Marketplace 使用此变量在客户的部署页面中为其部署命名。您应使用此变量来避免一个项目中的多个部署之间发生资源命名冲突。如需查看示例,请参阅自定义 Terraform 模块示例中的 goog_cm_deployment_name

  • metadata.display.yaml 文件中,您必须将 ET_GCE_DISK_IMAGE 指定为所有图片变量的 xGoogleProperty 类型。如需查看示例,请参阅自定义 Terraform 模块示例中的 metadata.display.yaml

  • 如果您的产品包含多虚拟机映像或支持多个 CPU 架构的映像,则必须添加 enumValueLabels,以便客户可以选择他们要使用的虚拟机映像。如需查看示例,请参阅自定义 Terraform 模块示例

  • 您的模块不得依赖于对 Terraform 预配工具的支持。

自定义 Terraform 模块的额外步骤

如果您选择使用自定义 Terraform 模块,则必须完成以下额外步骤,才能配置要部署的虚拟机映像:

  1. 在 Producer Portal 中,前往 Deployment package(部署包)部分。

  2. Terraform configuration 下的 Image Variables 下,点击 Add variable

    如需为您的产品启用 Terraform 部署,您必须已启用 Marketplace 自有映像的使用。当客户部署您的产品时,Cloud Marketplace 会使用您在此处添加的变量来替换 Marketplace 拥有的虚拟机映像版本。

  3. 图片变量文本字段中,输入变量的名称,例如“image”。

  4. 在自定义 Terraform 模块中,将您在上一步中创建的变量的默认值设置为产品的虚拟机映像名称,格式为 projects/YOUR_PROJECT/global/images/YOUR_IMAGE

  5. 指定 GCS 对象位置下,点击浏览

    如果您已创建 Cloud Storage 存储桶,请在此处选择该存储分区。

    如果您没有 Cloud Storage 存储桶,请点击标记为创建新存储桶的图标。创建新存储桶时,您需要执行以下操作:

    • 为存储桶选择名称。

    • 指定存储桶在其中存储数据的一个或多个区域。

    • 指定数据的存储类别。

    • 确定应用于存储桶数据的Identity and Access Management (IAM) 权限的粒度级别。

    • 配置可选的高级设置,例如加密或数据保留政策。

  6. 确保您的 Cloud Storage 存储桶已启用对象版本控制

  7. 如需保存存储桶设置并继续配置部署包,请点击配置

  8. 所需角色下,指定客户在部署产品时必须具备的 IAM 角色。

(仅限界面部署)为您的自定义 Terraform 模块创建元数据

为了让您的自定义模块支持界面部署,您必须创建和添加元数据,供 Cloud Marketplace 用于为客户正确解析模块并将其呈现在界面中。

如需创建并添加此元数据,您可以使用开源 CFT CLI 工具。如需使用 CFT 创建元数据并将其添加到自定义模块,请完成以下步骤:

  1. 安装 CFT CLI 工具。如需了解详情,请访问 CFT CLI 文档。 我们建议您将 VERSION 的值设置为 latest,并将 PLATFORM 设置为以下值之一:

    • linux

    • windows

    • darwin

  2. 运行以下命令:

     cft blueprint metadata -p TF_PACKAGE_PATH -q -d --nested=false
    

    在上一个命令中,-p 标志为 Terraform 软件包提供路径,-q 标志生成无需远程代码库信息的元数据,-d 标志生成 metadata.display.yaml 文件,--nested=false 标志为根模块生成元数据,从而跳过 modules/ 文件夹中的任何模块。

完成上述步骤后,CFT CLI 工具会生成两个新文件:metadata.yamlmetadata.display.yaml

自定义自定义 Terraform 模块的元数据

Cloud Marketplace 使用文件 metadata.display.yaml 来自定义客户通过界面部署产品时所使用的表单。如果您想自定义此表单,请在创建元数据后更改 metadata.display.yaml 中字段的值。如需详细了解可用的自定义选项,请参阅开源 BlueprintUI 文档BlueprintUI 架构

我们建议您使用扩展程序 GooglePropertyExtensions 来更改元数据。GooglePropertyExtensions 允许您使用特定于 Google Cloud 的验证,例如强制客户只能选择其项目中已存在的 Virtual Private Cloud (VPC) 网络。如需查看示例,请参阅自定义 Terraform 模块示例

验证自定义模块的元数据

如需验证自定义模块的元数据,请运行以下命令:

cft blueprint metadata -p TF_PACKAGE_PATH -v

在上述命令中,-p 标志提供 Terraform 软件包的路径,-v 标志根据 BlueprintMetadata 架构验证所提供的路径下的所有元数据文件。

测试您的模块是否通过了验证

如果以下命令成功运行,您的自定义模块将通过验证:

terraform plan -var project_id=YOUR_PROJECT -var-file marketplace_test.tfvars

在上一个命令中,marketplace_test.tfvars 是一个 Terraform 变量文件,仅供 Cloud Marketplace 用于此模块验证。如果您的模板声明了没有默认值的变量,而您没有为这些变量设置值,则命令不会成功运行。为了确保该命令成功运行,您可以创建一个 marketplace_test.tfvars 文件,为模板声明的变量设置值。如需查看 marketplace_test.tfvars 文件示例,请参阅自定义 Terraform 模块示例

(可选)(仅限 CLI 部署)添加测试模块

(可选)如果您的自定义模块支持 CLI 部署,您可以选择包含名为 examples/marketplace_test 的文件夹。如果您的产品需要包含一个单独的测试模块来验证其功能,您可能需要这样做。如果您添加了此文件夹,则为了使模块能够通过验证,以下命令必须成功运行:

terraform -chdir=examples/marketplace_test plan -var project_id=YOUR_PROJECT

验证和测试部署

创建和配置部署包后,您必须先对其进行验证和测试,然后 Cloud Marketplace 团队才能对其进行审核和批准。

  1. 在 Producer Portal 中,前往 Deployment package(部署包)部分。

  2. 点击验证。验证流程最长可能需要两个小时才能完成,您可以在该流程运行时退出界面。

  3. 成功完成验证后,点击部署预览以测试部署。

后续步骤

成功验证和测试部署后,您可以点击发布,提交整个产品以供审核并在 Cloud Marketplace 上发布。如需了解详情,请参阅提交商品