

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 指令碼管理
<a name="scripts-management"></a>

Cloud Migration Factory on AWS 解決方案可讓使用者在使用者介面中完整管理自動化指令碼或套件的程式庫。您可以使用指令碼管理界面上傳新的自訂指令碼以及指令碼的新版本。當有多個版本可用時，管理員可以在這些版本之間切換，以便在進行預設更新之前測試更新。指令碼管理界面也允許管理員下載指令碼套件來更新或檢閱內容。

支援的指令碼套件是壓縮的 zip 封存檔，其中包含根目錄中的下列必要檔案：
+  **Package-Structure.yml** - 用於定義指令碼的引數和其他中繼資料，例如描述和預設名稱。如需詳細資訊[，請參閱編寫新的指令碼套件](#composing-a-new-script-package)。
+  **【自訂 python 指令碼】。py** - 這是提交任務時將執行的初始指令碼。此指令碼可以呼叫其他指令碼和模組，如果是的話，這些應該包含在封存中。此指令碼的名稱必須符合 中`MasterFileName`金鑰中指定的值`Package-Structure.yml`。

## 運算平台組態
<a name="compute-platform-configuration"></a>

兩個運算平台可用於執行自動化指令碼：\$1 "SSM Automation Document" - 直接執行指令碼做為 AWS Systems Manager Automation Document，而不需要自動化伺服器 \$1 "Automation Server" - 在專用自動化伺服器執行個體上執行指令碼 （若未指定，此為預設平台）

指令碼執行的運算平台在 `Package-Structure.yml` 檔案中定義，對於以 SSM 為基礎的直接引數，請在 之後新增以下行`MasterFileName`： `ComputePlatform: "SSM Automation Document"`

## 上傳新的指令碼套件
<a name="upload-new-script-package"></a>

**注意**  
指令碼套件必須符合支援的格式。如需詳細資訊[，請參閱編寫新的指令碼套件](#composing-a-new-script-package)。

1. 選擇 **Automation Scripts** 資料表上的**新增**。

1. 選取您要上傳的套件封存檔案。

1. 輸入指令碼的唯一名稱。使用者將以此名稱參考指令碼以啟動任務。

## 下載指令碼套件
<a name="download-script-packages"></a>

您可以從主控台下載指令碼套件，以啟用更新和內容驗證。

1. 選取**自動化**，然後選取**指令碼**。

1. 選取您要從資料表下載的指令碼，然後選取**動作**，然後選擇**下載預設版本**或**下載最新版本**。

您可以下載特定版本的指令碼。若要這樣做，請選取指令碼，然後選取**動作**，然後選擇**變更預設版本。**從**指令碼預設版本**清單中，選擇**下載選取的版本**。

## 新增新版本的指令碼套件
<a name="add-new-version-of-a-script-package"></a>

您可以依照下列步驟，在**自動化** > 指令碼區段中上傳 AWS Cloud Migration Factory **指令碼套件的**更新：

1. 選取**自動化，**然後選取**指令碼。**

1. 選取現有的指令碼以新增新版本，然後選取**動作**，然後選擇**新增新版本**。

1. 選取您要上傳的更新套件封存檔案，然後選擇**下一步**。新的指令碼版本預設會保留現有的名稱。輸入唯一的指令碼名稱。任何名稱變更只會套用至此版本的指令碼。

1. 您可以透過選取**建立預設版本，將新版本的指令碼設為預設版本**。

1. 選擇**上傳**。

## 刪除指令碼套件和版本
<a name="deleting-script-packages-and-versions"></a>

您無法刪除指令碼或指令碼版本以進行稽核。這允許檢閱在某個時間點對系統執行的確切指令碼。每個指令碼版本在上傳時都有唯一的簽章和 ID，該簽章和 ID 會根據指令碼和版本所使用的任務歷史記錄進行記錄。

## 編寫新的指令碼套件
<a name="composing-a-new-script-package"></a>

AWS 指令碼套件上的 Cloud Migration Factory 支援 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. 嘗試存取包含服務帳戶 userid 和密碼的預設秘密，如果它存在並允許存取。將會檢查此秘密名稱 **MFServiceAccount-`userpool id`】**。

1. 如果步驟 1 失敗，且使用者從命令列執行指令碼，則會提示使用者提供 AWS Cloud Migration 原廠使用者 ID 和密碼。如果從遠端自動化任務執行，任務將會失敗。

 `get_server_credentials` 

傳回存放在 AWS Cloud Migration Factory 中 Credentials Manager 或透過使用者輸入之伺服器的登入憑證。此函數會檢查數個不同的來源，以判斷特定伺服器的登入資料，來源順序為：

1. 如果 local\$1username 和 local\$1password 已設定且有效，則會傳回這些值。

1. 如果已設定 secret\$1overide，則會使用此項目從 AWS Secret Manager 擷取指定的秘密，否則， 會檢查伺服器記錄是否包含金鑰 **secret\$1name**，而且這不是空的，則會使用此秘密名稱。

1. 如果找不到或存取指定的秘密，則函數會回復為提示使用者輸入登入資料，但前提是 **no\$1user\$1prompts** 設定為 **False**，否則會傳回失敗。

 **參數** 

local\$1username - 如果傳遞，則會傳回 。

local\$1password - 如果傳遞，則會傳回 。

server - CMF Server dict，如 AWS Cloud Migration Factory 中的 get\$1factory\$1servers. 所傳回。

Secret\$1overide - 傳遞後，這會設定要從此伺服器的 Secrets Manager 擷取的秘密名稱。

No\$1user\$1prompts - 告知函數不要在未儲存時提示使用者輸入使用者 ID 和密碼，這對於任何遠端自動化指令碼都應該為 True。

 `get_credentials` 

從 Secrets Manager 取得使用 AWS Cloud Migration Factory Credentials Manager 存放的登入資料。

 **參數** 

secret\$1name - 要擷取的秘密名稱。

get\$1factory\$1servers

根據提供的波狀，從 AWS Cloud Migration Factory 資料存放區傳回伺服器陣列。

 **參數** 

waveid - 將傳回之伺服器的 Wave 記錄 ID。

字符 - 從 FactoryLogin Lambda 函數取得的身分驗證字符。

app\$1ids - 要在波動中包含的應用程式 ID 選用清單。

server\$1ids - Wave 內的選用伺服器 ID 清單和要包含的應用程式。

os\$1split - 如果設定為 `true`，則會傳回兩個 Linux 清單和一個 Windows 伺服器清單，如果為 False，則會傳回單一合併清單。

rtype - 僅針對伺服器的特定遷移策略篩選的選用字串，即傳遞值 "Rehost" 只會傳回具有 Rehost 的伺服器。

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

建議提供指令碼結果的摘要訊息，做為畫面或 sysout 的最終輸出。這會顯示在主控台的 **Last Message** 屬性中，可提供指令碼結果的快速狀態，使用者不必讀取完整的輸出日誌。

#### 傳回程式碼
<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 檔案名稱。

 **引數** - MasterFileName Python 指令碼接受的引數清單。指定的每個引數需求都採用 AWS Cloud Migration Factory 屬性定義格式。每個引數的必要屬性為**名稱**和**類型**，所有其他屬性都是選用的。

選用

 **ComputePlatform** - 此金鑰定義指令碼執行的位置。設定為「SSM 自動化文件」，可在沒有自動化伺服器的 AWS Systems Manager 中直接執行。如果省略， 預設為在自動化伺服器上執行。

 **UpdateUrl** - 提供指令碼套件來源可用於提供更新的 URL。目前僅供參考。

 **SchemaExtensions** - Python 指令碼在結構描述中儲存輸出或擷取其他資料所需的屬性清單。每個屬性都必須以 AWS CMF 屬性定義格式指定。每個屬性的必要屬性為**結構描述**、**名稱、描述**和**類型**。所有其他屬性是選用的。任何新的屬性都會在最初載入指令碼時自動新增至結構描述，而且不會針對指令碼的新版本處理 SchemaExtensions 的變更。如果需要新增新的指令碼，則必須手動更新結構描述。