

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

# 脚本管理
<a name="scripts-management"></a>

AWS 上的 Cloud Migration Factory 解决方案允许用户在用户界面中全面管理自动化脚本或软件包库。您可以使用脚本管理界面上传新的自定义脚本以及脚本的新版本。当有多个版本可用时，管理员可以在这些版本之间切换，从而能够在将更新设为默认版本之前对其进行测试。脚本管理界面还允许管理员下载脚本包以更新或查看内容。

支持的脚本包是一个压缩的 zip 存档，根目录中包含以下必需文件：
+  p@@ **ackage-structure.yml**-用于定义脚本的参数和其他元数据，例如描述和默认名称。有关更多详细信息，请参阅 [Composing a new script package](#composing-a-new-script-package)。
+  **[自定义 python 脚本] .py**-这是提交作业时将运行的初始脚本。此脚本可以调用其他脚本和模块，如果是，则应将其包含在存档中。此脚本的名称必须与 `Package-Structure.yml` 中 `MasterFileName` 键中指定的值相匹配。

## 计算平台配置
<a name="compute-platform-configuration"></a>

有两个计算平台可用于执行自动化脚本：\$1 “SSM 自动化文档”-直接将脚本作为 AWS Systems Manager Automation 文档执行，无需自动化服务器 \$1 “自动化服务器”-在专用的自动化服务器实例上执行脚本（如果未指定，则这是默认平台）

`Package-Structure.yml`文件中定义了脚本执行的计算平台，对于基于 SSM 的直接自动化，请在后面添加以下一行：`MasterFileName``ComputePlatform: "SSM Automation Document"`

## 上传新的脚本包
<a name="upload-new-script-package"></a>

**注意**  
脚本包必须符合支持的格式。有关更多详细信息，请参阅 [Composing a new script package](#composing-a-new-script-package)。

1. 在**自动化脚本**表中选择**添加**。

1. 选择要上传的数据包存档文件。

1. 为脚本输入唯一名称。用户将以此名称引用脚本来启动作业。

## 下载脚本包
<a name="download-script-packages"></a>

您可以从控制台下载脚本包以激活更新和内容验证。

1. 选择**自动化**，然后选择**脚本**。

1. 从表格中选择要下载的脚本，然后选择**操作**并选择**下载默认版本**或**下载最新版本**。

您可以下载脚本的特定版本。为此，请选择脚本，然后选择**操作**，然后选择**更改默认版本** 从**脚本默认版本**列表中，选择**下载所选版本**。

## 添加脚本包的新版本
<a name="add-new-version-of-a-script-package"></a>

按照以下步骤，可以在 “**自动化**” > “脚本” 部分上传对 AWS 云迁移工厂**脚本**包的更新：

1. 选择**自动化**，然后选择**脚本**。

1. 选择要添加新版本的现有脚本，然后选择**操作**并选择**添加新版本**。

1. 选择要上传的更新的数据包存档文件，然后选择**下一步**。默认情况下，新的脚本版本将保留现有名称。输入唯一的脚本名称。任何名称更改都将仅适用于此版本的脚本。

1. 通过选择**设为默认版本**，可以将新版本的脚本设为默认版本。

1. 选择**上传**。

## 删除脚本包和版本
<a name="deleting-script-packages-and-versions"></a>

您不能出于审计目的删除脚本或脚本版本。这样就可以查看某个时间点针对系统运行的确切脚本。每个脚本版本在上传时都有一个唯一的签名和 ID，这些签名和 ID 会记录在使用该脚本和版本的作业历史记录中。

## 编写新的脚本包
<a name="composing-a-new-script-package"></a>

AWS 脚本包上的云迁移工厂支持 Python 作为主要脚本语言。您可以根据需要在 Python 主程序或包装器中启动其他 shell 脚本语言。要快速创建一个新的脚本包，我们建议下载一个预打包脚本的副本，然后更新它来执行所需的任务。您必须首先创建一个主 Python 脚本，它将执行脚本的核心功能。然后，创建一个 `Package-Structure.yml` 文件来定义脚本所需的参数和其他元数据。有关更多详细信息，请参阅 `Package-Structure.yml` 选项。

### 主 Python 脚本
<a name="main-python-script"></a>

这是启动作业时运行的初始主脚本。脚本完成运行后，任务就完成了，最终的返回代码决定了作业的状态。远程运行时，该脚本的所有输出都会被捕获，并传入任务的输出审计日志中，以供参考。此日志也存储在 Amazon 中 CloudWatch。

#### 通过 AWS 数据和 APIs 脚本访问云迁移工厂
<a name="accessing-cloud-migration-factory-on-aws-data-and-apis-from-a-script"></a>

要提供对 AWS 上云迁移工厂 APIs 和数据的访问权限，您可以使用随附的 python 帮助器模块。该模块提供了以下主要功能，以下是一些入门的关键功能：

 `factory_login` 

返回可用于在 AWS 上调用 “云迁移工厂” 的访问令牌 APIs。此功能将尝试登录 CMF，并尝试使用一定次数的凭证：

1. 尝试访问包含服务帐户用户 ID 和密码的默认密钥（如果存在且允许访问）。将检查此机密名称**MFService帐户-`userpool id`]**。

1. 如果步骤 1 不成功，并且用户正在通过命令行运行脚本，则系统将提示用户提供 AWS Cloud Migration 出厂用户名和密码。如果从远程自动化作业运行，则该作业将失败。

 `get_server_credentials` 

通过凭证管理器或通过用户输入返回存储在 AWS 云迁移工厂中的服务器的登录凭证。该函数将检查多个不同来源，以确定特定服务器的凭证，这些来源的顺序为：

1. 如果设置了 local\$1username 和 local\$1password 并且有效，则将返回这些内容。

1. 如果设置了 secret\$1overide，则将使用它来检索从 AWS Secret Manager 中指定的密钥，否则，检查服务器记录是否包含密钥 **secret\$1name 并且该密钥不为空，则将使用此密钥名称**。

1. 如果定位或访问指定的密钥时出现故障，则该函数将回退到提示用户输入凭证，但前提是 **no\$1user\$1prompts** 设置为 **False**，否则它将返回失败。

 **参数** 

local\$1username-如果通过，则将返回。

local\$1password-如果通过，则将返回。

server-CMF Servers 字典，由 AWS 云迁移工厂中的 get\$1factory\$1servers. 返回。

secret\$1overide-通过后，它将设置要从该服务器的 Secrets Manager 中检索的密钥名称。

no\$1user\$1promps-告诉函数不要提示用户输入用户 ID 和密码（如果未存储），任何远程自动化脚本都应为 True。

 `get_credentials` 

从 Secrets Manager 中获取使用 AWS 云迁移工厂证书管理器存储的证书。

 **参数** 

secret\$1name-要检索的密钥的名称。

get\$1factory\$1servers

根据提供的 waveid 从 AWS 云迁移工厂数据存储中返回服务器数组。

 **参数** 

waveid-将返回的服务器的 Wave 记录 ID。

令牌-从 FactoryLogin Lambda 函数获取的身份验证令牌。

app\$1ids-要包含的浪潮中可选的应用程序 ID 列表。

server\$1ids-波浪中的服务器 ID 和要包含的应用程序的可选列表。

os\$1split-如果设置为`true`，则将返回两个列表，一个用于 Linux，一个用于 Windows 服务器，如果为 False，则返回一个组合列表。

rtype-可选字符串，仅针对服务器的特定迁移策略进行筛选，即传递值 “Rehost” 将仅返回带有 Rehost 的服务器。

#### 最终消息摘要
<a name="final-message-summary"></a>

建议提供脚本结果的摘要消息，作为屏幕或 sysout 的最终输出。这将显示在控制台的**最终消息**属性中，该属性提供脚本结果的快速状态，用户无需阅读完整的输出日志。

#### 返回代码
<a name="return-code"></a>

如果主 python 脚本的运行不完全成功，则该脚本应该在退出时返回一个非零的返回代码。收到非零返回代码后，作业状态将在作业日志中显示为**失败**，向用户说明他们应查看输出日志以了解有关失败的详细信息。

### YAML Package-Structure.yml 选项
<a name="package-structure.yml-options"></a>

#### 示例 YAML 文件
<a name="example"></a>

```
Name: "0-Check MGN Prerequisites"
Description: "This script will verify the source servers meet the basic requirements for AWS MGN agent installation."
MasterFileName: "0-Prerequisites-checks.py"
UpdateUrl: ""
Arguments:
-
name: "ReplicationServerIP"
description: "Replication Server IP."
long_desc: "IP Address of an AWS MGN Replication EC2 Instance."
type: "standard"
required: true
-
name: "SecretWindows"
long_desc: "Windows Secret to use for credentials."
description: "Windows Secret"
type: "relationship"
rel_display_attribute: "Name"
rel_entity: "secret"
rel_key: "Name"
-
name: "SecretLinux"
long_desc: "Linux Secret to use for credentials."
description: "Linux Secret"
type: "relationship"
rel_display_attribute: "Name"
rel_entity: "secret"
rel_key: "Name"
-
name: "Waveid"
description: "Wave Name"
type: "relationship"
rel_display_attribute: "wave_name"
rel_entity: "wave"
rel_key: "wave_id"
validation_regex: "^(?!\\s*$).+"
validation_regex_msg: "Wave must be provided."
required: true
SchemaExtensions:
-
schema: "server"
name: "server_pre_reqs_output"
description: "Pre-Req Output"
type: "string"
```

#### YAML 键描述
<a name="keys"></a>

必需

 **名称**-脚本将在导入时使用的默认名称。

 **描述**-脚本用法的描述。

 **MasterFileName**-这是脚本运行的起点，它必须是脚本包存档中包含的 python 文件名。

 **参数**-P MasterFileName ython 脚本接受的参数列表。需要指定的每个参数都采用 AWS 云迁移工厂属性定义格式。每个参数的必需属性为 **Name** 和 **Type**，所有其他属性均为可选属性。

可选

 **ComputePlatform**-此键定义脚本将在何处执行。设置为 “SSM 自动化文档”，无需自动化服务器即可直接在 AWS Systems Manager 中运行。如果省略，则默认为在自动化服务器上执行。

 **UpdateUrl**-提供用于提供更新的脚本包源代码的 URL。目前这仅供参考。

 **SchemaExtensions**-Python 脚本在架构中存储输出或检索其他数据所需的属性列表。必须以 AWS CMF 属性定义格式指定每个属性。每个属性的必需属性为 **Schema** **Name、Description** 和 **Type**。所有其他属性均为可选属性。当脚本初次加载时，任何新属性都将自动添加到架构中，对于新版本的脚本， SchemaExtensions 将不会处理对的更改。如果需要这样才能添加新脚本，则必须手动更新架构。