创建软件包 - AWS Systems Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建软件包

要创建软件包,请准备您的可安装软件或资产,每个操作系统平台一个文件。需要至少一个文件才能创建软件包。

有时,不同的平台可以使用同一个文件,但附加到软件包的所有文件都必须列在清单的 Files 部分中。如果您在控制台中使用简单工作流程创建软件包,则会为您生成清单。最多可以向一个文档附加 20 个文件。每个文件的最大大小为 1 GB。有关支持的平台的更多信息,请参阅 支持的软件包平台和架构

创建软件包时,您添加的是一个新的 SSM 文档。此文档让您能够将软件包部署到托管实例。

仅出于演示目的,您可以从网站下载示例软件包 ExamplePackage.zip。该示例包包含一个完整的 JSON 清单和三个 .zip 文件(其中包含 PowerShell v7.0.0 的安装程序)。安装和卸载脚本不包含有效命令。虽然您必须在高级工作流程中将每个软件可安装文件和脚本压缩为 .zip 文件以创建软件包,但您不会在简单工作流程中压缩可安装资产。

创建软件包(简单)

本节介绍如何通过在 Distributor 控制台中选择简单软件包创建工作流程来在 Distributor 中创建软件包。要创建软件包,请准备您的可安装资产,每个操作系统平台一个文件。需要至少一个文件才能创建软件包。简单软件包创建过程为您生成安装和卸载脚本、文件哈希以及 JSON 格式的清单。简单工作流程处理上传和压缩可安装文件以及创建新软件包和关联的 SSM 文档的过程。有关支持的平台的更多信息,请参阅 支持的软件包平台和架构

在使用简单方法创建软件包时,Distributor 将为您创建 installuninstall 脚本。但是,当您为就地更新创建软件包时,必须在 updateUpdate script (更新脚本) 选项卡上提供您自己的 脚本内容。在为 update 脚本添加输入命令时,Distributor 将该脚本与 installuninstall 脚本一起包含在它创建的 .zip 包中。

注意

通过使用 In-place 更新选项,您可以将新文件或更新的文件添加到现有的软件包安装中,而无需将关联的应用程序脱机。

创建软件包(简单)

  1. 通过以下网址打开 AWS Systems Manager 控制台:https://console.amazonaws.cn/systems-manager/

  2. 在导航窗格中,选择Distributor

  3. 在 Distributor 主页上,选择 Create package (创建软件包),然后选择简单

  4. Create package (创建软件包) 页面上,输入软件包的名称。软件包名称可以包含字母、数字、句点、短划线和下划线。名称应足够通用,以适用于所有版本的软件包附件,但又足够具体,可用于识别软件包的用途。

  5. (可选)对于 Version name (版本名称),请输入版本名称。版本名称最多为 512 个字符,并且不能包含特殊字符。

  6. 对于 Location (位置),请使用存储桶名称和前缀或存储桶 URL 选择一个存储桶。

  7. 对于 Upload software (上传软件),请选择 Add software (添加软件),然后浏览具有 .rpm.msi.deb 扩展名的可安装软件文件。您可以在单个操作中上传多个软件文件。

  8. 对于目标平台,请验证为每个可安装文件显示的目标操作系统平台是否正确。如果显示的操作系统不正确,请从下拉列表中选择正确的操作系统。

    对于简单软件包创建工作流程中,由于您仅将每个可安装文件上传一次,因此,需要使用额外的步骤以指示 Distributor 在多个操作系统上将单个文件指定为目标。例如,如果您上传名为 Logtool_v1.1.1.rpm 的可安装软件文件,则必须更改简单工作流程中的某些默认值,以同时在 Amazon Linux 和 Ubuntu 操作系统上将相同的软件指定为目标。在针对多个平台时,请执行以下操作之一。

    • 改用高级工作流程,在开始之前将每个可安装文件压缩为 .zip 文件,然后手动编写清单,以便在多个操作系统平台或版本中将一个可安装文件指定为目标。有关更多信息,请参阅创建软件包(高级)

    • 简单工作流程中手动编辑清单文件,以便在多个操作系统平台或版本中将 .zip 文件指定为目标。有关如何执行此操作的更多信息,请参阅步骤 2:创建 JSON 软件包清单中步骤 4 的末尾。

  9. 对于 Platform version (平台版本),请确认显示的操作系统平台版本是 _any、主要发布版本后跟通配符 (7.*) 或您希望软件应用的确切操作系统发布版本。有关指定操作系统平台版本的更多信息,请参阅步骤 2:创建 JSON 软件包清单中的步骤 4。

  10. 对于架构,请从下拉列表中为每个可安装文件选择正确的处理器架构。有关支持的处理器架构的更多信息,请参阅支持的软件包平台和架构

  11. (可选)展开 Scripts (脚本),然后查看 Distributor 为可安装软件生成的脚本。

  12. (可选)要提供用于就地更新的更新脚本,请展开 Scripts (脚本),选择Update script (更新脚本) 选项卡,然后输入更新脚本命令。

    Systems Manager 不会代表您生成更新脚本。

  13. 要添加更多可安装的软件文件,请选择 Add software (添加软件)。否则,转到下一步。

  14. (可选)展开清单,然后审核 Distributor 为您的可安装软件包生成的 JSON 清单。如果您在开始此过程后更改了有关软件的任何信息(例如平台版本或目标平台),请选择 Generate manifest (生成清单) 以显示更新的软件包清单。

    如果要将可在多个操作系统上安装的软件指定为目标,则可以手动编辑清单,如步骤 8 中所述。有关编辑该清单的更多信息,请参阅步骤 2:创建 JSON 软件包清单

  15. 选择 Create package (创建软件包)

等待 Distributor 完成上传软件和创建软件包。 Distributor 显示每个可安装文件的上传状态。根据要添加的软件包的数量和大小,这可能需要几分钟时间。Distributor 会自动将您重定向到新软件包的 Package details (软件包详细信息) 页面,但您可以选择在上传软件之后自行打开此页面。Package details (软件包详细信息) 页面不会显示有关软件包的所有信息,直到 Distributor 完成软件包创建过程。要停止上传和软件包创建过程,请选择取消

如果 Distributor 无法上传任何软件可安装文件,它会显示 Upload failed (上传失败) 消息。要重试上传,请选择 Retry upload (重试上传)。有关如何排除软件包创建失败的更多信息,请参阅AWS Systems Manager Distributor 故障排除

创建软件包(高级)

在本节中,了解高级用户在将压缩有安装和卸载脚本的可安装资产以及 JSON 清单文件上传到 S3 存储桶后,如何在 Distributor 中创建软件包。

要创建软件包,请准备可安装资产的 .zip 文件(每个操作系统平台一个 .zip 文件)。需要具有至少一个 .zip 文件才能创建软件包。接下来,创建 JSON 清单。清单包含指向软件包代码文件的指针。将所需的代码文件添加到一个文件夹,并为清单填充正确的值,然后将软件包上传到 S3 存储桶。

您可以从网站下载示例软件包 ExamplePackage.zip。在示例软件包中包含一个完整 JSON 清单和三个 .zip 文件。

步骤 1:创建 ZIP 文件

软件包至少包含软件或可安装资产的一个 .zip 文件。对于要支持的每个操作系统,软件包包含一个 .zip 文件,除非可以在多个操作系统上安装一个 .zip 文件。例如,Red Hat Enterprise Linux 和 Amazon Linux 实例通常可以运行相同的 .RPM 可执行文件,因此,只需在软件包中附加一个 .zip 文件以支持这两种操作系统。

所需的文件

需要在每个 .zip 文件中包含以下项目:

  • install 脚本。基于 uninstall 的实例需要 Windows Server 脚本(名为 PowerShell 和 install.ps1 的脚本)。uninstall.ps1基于 Linux 的实例需要 Shell 脚本(名为 install.shuninstall.sh 的脚本)。SSM 代理 运行 installuninstall 脚本中的指令。

    例如,安装脚本可能会运行安装程序(例如 .rpm 或 .msi),它们可能会复制文件,或者它们可能会设置配置。

  • 可执行文件、安装程序软件包(.rpm、.deb、.msi 等)、其他脚本或配置文件。

可选的文件

以下项目在每个 .zip 文件中是可选的:

  • update 脚本。通过提供更新脚本,您可以使用 In-place update 选项安装软件包。当您要将新文件或更新的文件添加到现有软件包安装时,In-place update 选项不会在执行更新时将软件包应用程序脱机。基于 Windows Server 的实例需要 PowerShell 脚本(名为 update.ps1 的脚本)。基于 Linux 的实例需要使用 shell 脚本(名为 update.sh 的脚本)。SSM 代理 运行 update 脚本中的指令。

有关安装或更新软件包的更多信息,请参阅安装或更新软件包

有关 .zip 文件的示例(包括示例 installuninstall 脚本),请下载示例软件包 ExamplePackage.zip

步骤 2:创建 JSON 软件包清单

准备并压缩可安装文件后,需要创建一个 JSON 清单。模板如下。本节中的过程将对清单模板的各个部分进行说明。您可以使用 JSON 编辑器在单独的文件中创建此清单。或者,也可以在创建软件包时在 AWS Systems Manager 控制台中创建清单。

{ "schemaVersion": "2.0", "version": "your-version", "publisher": "optional-publisher-name", "packages": { "platform": { "platform-version": { "architecture": { "file": ".zip-file-name-1.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": ".zip-file-name-2.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": ".zip-file-name-3.zip" } } } }, "files": { ".zip-file-name-1.zip": { "checksums": { "sha256": "checksum" } }, ".zip-file-name-2.zip": { "checksums": { "sha256": "checksum" } } } }

创建 JSON 软件包清单

  1. 将架构版本添加到清单。在此版本中,架构版本始终为 2.0

    { "schemaVersion": "2.0",
  2. 将用户定义的软件包版本添加到清单。这也是您在将软件包添加到 时指定的 Version name (版本名称)Distributor 的值。添加软件包时,它将成为 Distributor 创建的 AWS Systems Manager 文档的一部分。您还可以在 AWS-ConfigureAWSPackage 文档中将此值作为输入提供,以安装除最新版本以外的软件包版本。version 值可以包含字母、数字、下划线、连字符和句点,最大长度为 128 个字符。建议使用易读的软件包版本,以便您和其他管理员在部署时更轻松地指定确切的软件包版本。以下是示例。

    "version": "1.0.1",
  3. (可选)添加发布者名称。以下是示例。

    "publisher": "MyOrganization",
  4. 添加软件包。"packages" 部分描述软件包中的 .zip 文件支持的平台、发行版本和架构。有关更多信息,请参阅支持的软件包平台和架构

    这些区域有:platform-version 可以是通配符值 _any。 使用它指示 .zip 文件支持任何平台版本。您还可以指定一个主要发布版本,后跟一个通配符,以便支持所有次要版本,例如 7.*。如果您选择指定 platform-version 特定操作系统版本的 值时,请确保它与您设定为目标的操作系统 AMI 的发行版本完全匹配。以下是用于获取正确的操作系统值的推荐资源。

    • 在基于 Windows Server 的实例上,发行版本可用作 Windows Management Instrumentation (WMI) 数据。您可以在基于 Windows Server 的实例上运行以下命令提示符命令来获取版本信息,然后解析 version 的结果。 此命令不显示 Windows Server Nano 的版本;Windows Server Nano 的版本值为 nano

      wmic OS get /format:list
    • 在基于 Linux 的实例上,可以通过以下方式获取版本:先扫描操作系统版本(下面的命令)。然后查找 VERSION_ID 的值。

      cat /etc/os-release

      如果这未返回您需要的结果,请运行下面的命令从 /etc/lsb-release 文件获取 LSB 版本信息,并查找 DISTRIB_RELEASE 的值。

      lsb_release -a

      如果上述方法都不奏效,您通常可以根据分发软件包查找版本。例如,在 Debian Server 上,您可以扫描 /etc/debian_version 文件,或在 Red Hat Enterprise Linux 上扫描 /etc/redhat-release 文件。

      hostnamectl
    "packages": { "platform": { "platform-version": { "architecture": { "file": ".zip-file-name-1.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": ".zip-file-name-2.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": ".zip-file-name-3.zip" } } } }

    以下是示例。在该示例中,操作系统平台为 amazon,支持的发行版本为 2016.09,架构为 x86_64,支持该平台的 .zip 文件为 test.zip

    { "amazon": { "2016.09": { "x86_64": { "file": "test.zip" } } } },

    您可以添加通配符值 _any 来指示此软件包支持父元素的所有版本。例如,要指示 Amazon Linux 的任何发行版本都支持此软件包,您应使用类似以下内容的软件包语句。您可以在版本或架构级别使用 _any 通配符来支持平台的所有版本、某个版本的所有架构或某个平台的所有版本和所有架构。

    { "amazon": { "_any": { "x86_64": { "file": "test.zip" } } } },

    以下示例添加 _any 来表明 Amazon Linux 2016.09 的所有架构都支持第一个软件包 data1.zip。Amazon Linux 的所有版本都支持第二个软件包 data2.zip,但此软件包仅适用于采用 x86_64 架构的实例。和 2016.09 版本都是 _any 下的条目。amazon 有一个平台 (Amazon Linux),但支持的版本、架构和关联的 .zip 文件不同。

    { "amazon": { "2016.09": { "_any": { "file": "data1.zip" } }, "_any": { "x86_64": { "file": "data2.zip" } } } }

    如果 .zip 文件支持多个平台,您可以在清单的 "packages" 部分中多次引用该 .zip 文件。例如,如果您有一个同时支持 Red Hat Enterprise Linux 7.x 版本和 Amazon Linux 的 .zip 文件,则 "packages" 部分有两个指向同一 .zip 文件的条目,如以下示例所示。

    { "amazon": { "2018.03": { "x86_64": { "file": "test.zip" } } }, "redhat": { "7.*": { "x86_64": { "file": "test.zip" } } } },
  5. 添加属于步骤 4 中的软件包的 .zip 文件列表。每个文件条目都需要文件名和 sha256 哈希值校验和。清单中的校验和值必须与压缩资产中的 sha256 哈希值匹配,以防软件包安装失败。

    要从可安装资产获取确切的校验和,可以运行以下命令。在 Linux 上,运行 cat file-name.zip | openssl dgst -sha256。 在 Windows 上,在 Get-FileHash -Path path-to-.zip-filePowerShell 中运行 cmdlet。

    清单的 "files" 部分包含对软件包中的每个 .zip 文件的引用。

    "files": { "test-agent-x86.deb.zip": { "checksums": { "sha256": "EXAMPLE2706223c7616ca9fb28863a233b38e5a23a8c326bb4ae241dcEXAMPLE" } }, "test-agent-x86_64.deb.zip": { "checksums": { "sha256": "EXAMPLE572a745844618c491045f25ee6aae8a66307ea9bff0e9d1052EXAMPLE" } }, "test-agent-x86_64.nano.zip": { "checksums": { "sha256": "EXAMPLE63ccb86e830b63dfef46995af6b32b3c52ce72241b5e80c995EXAMPLE" } }, "test-agent-rhel5-x86.nano.zip": { "checksums": { "sha256": "EXAMPLE13df60aa3219bf117638167e5bae0a55467e947a363fff0a51EXAMPLE" } }, "test-agent-x86.msi.zip": { "checksums": { "sha256": "EXAMPLE12a4abb10315aa6b8a7384cc9b5ca8ad8e9ced8ef1bf0e5478EXAMPLE" } }, "test-agent-x86_64.msi.zip": { "checksums": { "sha256": "EXAMPLE63ccb86e830b63dfef46995af6b32b3c52ce72241b5e80c995EXAMPLE" } }, "test-agent-rhel5-x86.rpm.zip": { "checksums": { "sha256": "EXAMPLE13df60aa3219bf117638167e5bae0a55467e947a363fff0a51EXAMPLE" } }, "test-agent-rhel5-x86_64.rpm.zip": { "checksums": { "sha256": "EXAMPLE7ce8a2c471a23b5c90761a180fd157ec0469e12ed38a7094d1EXAMPLE" } } }
  6. 添加软件包信息后,保存并关闭清单文件。

下面是一个已完成的清单的示例。在该示例中,您具有一个 .zip 文件 NewPackage_LINUX.zip,它支持多个平台,但仅在 "files" 部分中引用一次。

{ "schemaVersion": "2.0", "version": "1.7.1", "publisher": "Amazon Web Services", "packages": { "windows": { "_any": { "x86_64": { "file": "NewPackage_WINDOWS.zip" } } }, "amazon": { "_any": { "x86_64": { "file": "NewPackage_LINUX.zip" } } }, "ubuntu": { "_any": { "x86_64": { "file": "NewPackage_LINUX.zip" } } } }, "files": { "NewPackage_WINDOWS.zip": { "checksums": { "sha256": "EXAMPLEc2c706013cf8c68163459678f7f6daa9489cd3f91d52799331EXAMPLE" } }, "NewPackage_LINUX.zip": { "checksums": { "sha256": "EXAMPLE2b8b9ed71e86f39f5946e837df0d38aacdd38955b4b18ffa6fEXAMPLE" } } } }

软件包示例

您可以从网站下载示例软件包 ExamplePackage.zip。在示例软件包中包含一个完整 JSON 清单和三个 .zip 文件。

步骤 3:将软件包和清单上传到 S3 存储桶

将所有 .zip 文件复制或移动到一个文件夹或目录以准备软件包。有效的软件包需要具有在步骤 2:创建 JSON 软件包清单中创建的清单以及在清单文件列表中指定的所有 .zip 文件。

将软件包和清单上传到 Amazon S3

  1. 将清单中指定的所有 .zip 存档文件复制或移动到一个文件夹或目录中。不要压缩 .zip 存档文件和清单文件移到的文件夹或目录。

  2. 创建存储桶或选择现有的存储桶。有关更多信息,请参阅 https://docs.amazonaws.cn/AmazonS3/latest/gsg/CreatingABucket.html 入门指南 中的Amazon Simple Storage Service创建存储桶。有关如何运行 AWS CLI 命令来创建存储桶的更多信息,请参阅 命令参考mb 中的 AWS CLI。

  3. 将此文件夹上传到存储桶。有关更多信息,请参阅 https://docs.amazonaws.cn/AmazonS3/latest/gsg/PuttingAnObjectInABucket.html 入门指南 中的Amazon Simple Storage Service将对象添加到存储桶。如果打算将 JSON 清单粘贴到 AWS Systems Manager 控制台,则不要上传清单。有关如何运行 AWS CLI 命令以将文件上传到存储桶的更多信息,请参阅 命令参考mv 中的 AWS CLI

  4. 在存储桶的主页上,选择您上传的文件夹。如果您将文件上传到存储桶中的子文件夹,请务必记下子文件夹(也称为前缀)。您需要此前缀以将软件包添加到 Distributor。

步骤 4:将软件包添加到 Distributor

您可以使用 AWS Systems Manager 控制台、AWS 命令行工具(AWS CLI 和 适用于 PowerShell 的 AWS 工具)或 AWS SDKs 将新软件包添加到 AWS Systems Manager Distributor。添加软件包时,您添加的是一个新的 SSM 文档。此文档让您能够将软件包部署到托管实例。

添加软件包(控制台)

可使用 AWS Systems Manager 控制台创建软件包。准备好您在步骤 3:将软件包和清单上传到 S3 存储桶中将软件包上传到的存储桶的名称。

将软件包添加到 Distributor(控制台)

  1. 通过以下网址打开 AWS Systems Manager 控制台:https://console.amazonaws.cn/systems-manager/

  2. 在导航窗格中,选择Distributor

  3. 在 Distributor 主页上,选择 Create package (创建软件包),然后选择高级

  4. Create package (创建软件包) 页面上,输入软件包的名称。软件包名称可以包含字母、数字、句点、短划线和下划线。名称应足够通用,以适用于所有版本的软件包附件,但又足够具体,可用于识别软件包的用途。

  5. 对于 Version name (版本名称),请输入清单文件中的 version 条目的确切值。

  6. 对于 S3 bucket name (S3 存储桶名称),请选择在步骤 3:将软件包和清单上传到 S3 存储桶中将 .zip 文件和清单上传到的存储桶的名称。

  7. 对于 S3 key prefix (S3 键前缀),请输入存储 .zip 文件和清单的存储桶子文件夹。

  8. 对于 Manifest (清单),请选择 Extract from package (从软件包提取) 以使用随 .zip 文件上传到 S3 存储桶的清单。

    (可选)如果未将 JSON 清单上传到存储 .zip 文件的 S3 存储桶,请选择 New manifest (新建清单)。您可以在 JSON 编辑器字段中编写或粘贴整个清单。有关如何创建 JSON 清单的更多信息,请参阅步骤 2:创建 JSON 软件包清单

  9. 当您处理完清单后,选择 Create package (创建软件包)

  10. 等待 Distributor 从 .zip 文件和清单中创建软件包。根据要添加的软件包的数量和大小,这可能需要几分钟时间。Distributor 会自动将您重定向到新软件包的 Package details (软件包详细信息) 页面,但您可以选择在上传软件之后自行打开此页面。Package details (软件包详细信息) 页面不会显示有关软件包的所有信息,直到 Distributor 完成软件包创建过程。要停止上传和软件包创建过程,请选择取消

添加软件包 (AWS CLI)

可使用 AWS CLI 创建软件包。准备好您在步骤 3:将软件包和清单上传到 S3 存储桶中将软件包上传到的存储桶的 URL。

将软件包添加到 Amazon S3 (AWS CLI)

  1. 要使用 AWS CLI 创建软件包,请运行以下命令,并将 package-name 替换为您的程序包名称,path-to-manifest-file 替换为 JSON 清单文件的文件路径。 是存储整个软件包的 S3 存储桶的 URL。在 Distributor 中运行 create-document 命令时,为 --document-type 指定 Package 值。

    如果未将清单文件添加到 S3 存储桶,则 --content 参数值为 JSON 清单文件的文件路径。

    aws ssm create-document \ --name "package-name" \ --content file://path-to-manifest-file \ --attachments Key="SourceUrl",Values="" \ --version-name version-value-from-manifest \ --document-type Package

    以下是示例。

    aws ssm create-document \ --name "ExamplePackage" \ --content file://path-to-manifest-file \ --attachments Key="SourceUrl",Values="https://s3.amazonaws.com/DOC-EXAMPLE-BUCKET/ExamplePackage" \ --version-name 1.0.1 \ --document-type Package
  2. 通过运行以下命令验证软件包是否已添加并显示软件包清单,同时替换 package-name 替换为您的程序包的名称。要获取文档的特定版本(不同于软件包的版本),可以添加 --document-version 参数。

    aws ssm get-document \ --name "package-name"

有关可以在 create-document 命令中使用的其他选项的信息,请参阅 create-document 的 AWS Systems Manager 部分中的 AWS CLI Command Reference。有关可以与 get-document 命令配合使用的其他选项的信息,请参阅 get-document