管理 Azure 自動化中的 Runbook
您可以將 Runbook 新增至 Azure 自動化,方法是建立新的,或是從檔案或 Runbook 資源庫匯入現有的。 本文提供管理 Runbook 和 Runbook 設計建議模式與最佳做法的資訊。 您可以在 Azure 自動化的 Runbook 和模組資源庫中找到有關存取社群 Runbook 和模組的所有詳細資料。
建立 Runbook
使用 Azure 入口網站或 PowerShell,在 Azure 自動化中建立新的 Runbook。 一旦建立 Runbook 之後,您可以使用下列文章中的資訊加以編輯:
- 在 Azure 自動化中編輯文字式 Runbook
- 了解適用於自動化 Runbook 的重要 PowerShell 工作流程概念
- 管理 Azure 自動化中的 Python 2 套件
- 管理 Azure 自動化中的 Python 3 套件 (預覽)
在 Azure 入口網站中建立 Runbook
- 登入 Azure 入口網站。
- 搜尋並選取 [自動化帳戶]。
- 在自動化帳戶分頁上,從清單中選取您的自動化帳戶。
- 在自動帳戶中,選取 [程序自動化] 底下的 [Runbook],以開啟 Runbook 清單。
- 按一下 [建立 Runbook]。
- 為 Runbook 命名。
- 從 [Runbook 類型] 下拉式清單中。 選取其類型。 Runbook 名稱必須以字母開頭,可以包含字母、數字、底線和連字號
- 選取執行階段版本
- 輸入適用的描述
- 按一下 [建立] 以建立 Runbook。
使用 PowerShell 建立 Runbook
您可以使用 New-AzAutomationRunbook \(英文\) Cmdlet 來建立空白 Runbook。 使用 Type
參數指定針對 New-AzAutomationRunbook
所定義四個 Runbook 類型的其中一個。
下列範例示範如何建立新的空白 Runbook。
$params = @{
AutomationAccountName = 'MyAutomationAccount'
Name = 'NewRunbook'
ResourceGroupName = 'MyResourceGroup'
Type = 'PowerShell'
}
New-AzAutomationRunbook @params
匯入 Runbook
您可以匯入 PowerShell 或 PowerShell 工作流程 (ps1) 指令碼、圖形化 Runbook (.graphrunbook) 或 Python 2 或 Python 3 指令碼 (.py) 來製作自己的 Runbook。 您須指定匯入期間建立的 Runbook 類型,並考量下列事項。
您可以將不包含工作流程的 .ps1 檔案匯入至 PowerShell Runbook 或 PowerShell 工作流程 Runbook。 您將其匯入 PowerShell 工作流程 Runbook,其會轉換成工作流程。 在此情況下,Runbook 中會包含註解來描述所做的變更。
您只能將包含 PowerShell 工作流程的 .ps1 檔案匯入至 PowerShell 工作流程 Runbook。 如果檔案包含多個 PowerShell 工作流程,則匯入會失敗。 您必須將每個工作流程儲存到它們各自的檔案,並且個別匯入。
請勿將包含 PowerShell 工作流程的 .ps1 檔案匯入 PowerShell Runbook,因為 PowerShell 指令碼引擎無法加以辨識。
只將 .graphrunbook 檔案匯入新的圖形化 Runbook。
從 Azure 入口網站匯入 Runbook
您可以使用下列程序,將指令碼檔案匯入到 Azure 自動化。
注意
若使用入口網站,您只能將 .ps1 檔案匯入 PowerShell 工作流程 Runbook。
- 在 Azure 入口網站中,搜尋並選取 [自動化帳戶]。
- 在自動化帳戶分頁上,從清單中選取您的自動化帳戶。
- 在自動帳戶中,選取 [程序自動化] 底下的 [Runbook],以開啟 Runbook 清單。
- 按一下 [匯入 Runbook]。 您可以選取下列其中一個選項:
- 瀏覽檔案 - 從本機電腦中選取檔案。
- 瀏覽資源庫 - 您可以瀏覽資源庫並選取現有的 Runbook。
- 選取 檔案。
- 如果 [名稱] 欄位已啟用,則您可以選擇變更 Runbook 名稱。 名稱必須以字母開頭,可以包含字母、數字、底線和連字號。
- Runbook 類型會自動填入,但在考量適用的限制之後,您可以變更類型。
- 執行階段版本會自動填入,或從下拉式清單中挑選版本。
- 按一下 [匯入]。 新的 Runbook 會顯示在自動化帳戶的 Runbook 清單中。
- 您必須先發佈 Runbook 才能執行它。
注意
匯入圖形化 Runbook 之後,您可以將其轉換成另一種類型。 不過,您無法將圖形化 Runbook 轉換成文字式 Runbook。
使用 PowerShell 匯入 Runbook
使用 Import-AzAutomationRunbook \(英文\) Cmdlet,來匯入為指令碼檔案以作為草稿 Runbook。 如果 Runbook 已經存在,除非您搭配 Cmdlet 使用 Force
參數,否則匯入會失敗。
以下範例示範如何將指令碼檔案匯入 Runbook。
$params = @{
AutomationAccountName = 'MyAutomationAccount'
Name = 'Sample_TestRunbook'
ResourceGroupName = 'MyResourceGroup'
Type = 'PowerShell'
Path = 'C:\Runbooks\Sample_TestRunbook.ps1'
}
Import-AzAutomationRunbook @params
處理資源
如果您的 Runbook 會建立資源,則指令碼應先檢查以查看資源是否已經存在,再嘗試加以建立。 以下是基本定義。
$vmName = 'WindowsVM1'
$rgName = 'MyResourceGroup'
$myCred = Get-AutomationPSCredential 'MyCredential'
$vmExists = Get-AzResource -Name $vmName -ResourceGroupName $rgName
if (-not $vmExists) {
Write-Output "VM $vmName does not exist, creating"
New-AzVM -Name $vmName -ResourceGroupName $rgName -Credential $myCred
} else {
Write-Output "VM $vmName already exists, skipping"
}
從活動記錄擷取詳細資料
您可以從自動化帳戶的活動記錄擷取 Runbook 詳細資料,例如啟動 Runbook 的人員或帳戶。 下列 PowerShell 範例會提供執行所指定 Runbook 的最後一個使用者。
$rgName = 'MyResourceGroup'
$accountName = 'MyAutomationAccount'
$runbookName = 'MyRunbook'
$startTime = (Get-Date).AddDays(-1)
$params = @{
ResourceGroupName = $rgName
StartTime = $startTime
}
$JobActivityLogs = (Get-AzLog @params).Where( { $_.Authorization.Action -eq 'Microsoft.Automation/automationAccounts/jobs/write' })
$JobInfo = @{}
foreach ($log in $JobActivityLogs) {
# Get job resource
$JobResource = Get-AzResource -ResourceId $log.ResourceId
if ($null -eq $JobInfo[$log.SubmissionTimestamp] -and $JobResource.Properties.Runbook.Name -eq $runbookName) {
# Get runbook
$jobParams = @{
ResourceGroupName = $rgName
AutomationAccountName = $accountName
Id = $JobResource.Properties.JobId
}
$Runbook = Get-AzAutomationJob @jobParams | Where-Object RunbookName -EQ $runbookName
# Add job information to hashtable
$JobInfo.Add($log.SubmissionTimestamp, @($Runbook.RunbookName, $Log.Caller, $JobResource.Properties.jobId))
}
}
$JobInfo.GetEnumerator() | Sort-Object Key -Descending | Select-Object -First 1
追蹤進度
最佳做法是使用可輕鬆重複使用及重新啟動的邏輯,將您的 Runbook 撰寫為本質上是模組化的。 追蹤 Runbook 中的進度可確保 Runbook 邏輯會在發生問題時正確執行。
您可以藉由使用儲存體帳戶、資料庫或共用檔案等外部來源來追蹤 Runbook 進度。 在您的 Runbook 中建立邏輯,以先檢查所採取最後一個動作的狀態。 然後,根據檢查結果,邏輯可以略過或繼續 Runbook 中的特定工作。
防止並行作業
某些 Runbook 如果跨多個作業同時執行,其會以奇怪的方式運作。 在此情況下,Runbook 務必要實作判斷是否已經有執行中作業的邏輯。 以下是基本定義。
# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process
# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context
# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
# Check for already running or new runbooks
$runbookName = "runbookName"
$resourceGroupName = "resourceGroupName"
$automationAccountName = "automationAccountName"
$jobs = Get-AzAutomationJob -ResourceGroupName $resourceGroupName -AutomationAccountName $automationAccountName -RunbookName $runbookName -DefaultProfile $AzureContext
# Ranking all the active jobs
$activeJobs = $jobs | where {$_.status -eq 'Running' -or $_.status -eq 'Queued' -or $_.status -eq 'New' -or $_.status -eq 'Activating' -or $_.status -eq 'Resuming'} | Sort-Object -Property CreationTime
$jobRanking = @()
$rank = 0
ForEach($activeJob in $activeJobs)
{
$rank = $rank + 1
$activeJob | Add-Member -MemberType NoteProperty -Name jobRanking -Value $rank -Force
$jobRanking += $activeJob
}
$AutomationJobId = $PSPrivateMetadata.JobId.Guid
$currentJob = $activeJobs | where {$_.JobId -eq $AutomationJobId}
$currentJobRank = $currentJob.jobRanking
# Only allow the Job with Rank = 1 to start processing.
If($currentJobRank -ne "1")
{
Write-Output "$(Get-Date -Format yyyy-MM-dd-hh-mm-ss.ffff) Concurrency check failed as Current Job Ranking is not 1 but $($currentJobRank) therefore exiting..."
Exit
} Else
{
Write-Output "$(Get-Date -Format yyyy-MM-dd-hh-mm-ss.ffff) Concurrency check passed. Start processing.."
}
如果您想要 Runbook 以系統指派的受控識別來執行,請將程式碼保持原狀。 如果您偏好使用使用者指派的受控識別,則:
- 從第 5 行移除
$AzureContext = (Connect-AzAccount -Identity).context
、 - 將其取代為
$AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context
,然後 - 輸入用戶端識別碼。
注意
針對 PowerShell 7.2 混合式作業,變更第 28 行。 把 $PSPrivateMetadata.JobId.Guid
替換為 $env:PSPrivateMetaData
。
在時間相依指令碼中處理暫時性錯誤
您的 Runbook 必須健全且能夠處理錯誤,包括可能導致其重新啟動或失敗的暫時性錯誤。 如果 Runbook 失敗,Azure 自動化會加以重試。
如果您的 Runbook 通常會在有限時間內執行,請讓指令碼實作邏輯來檢查執行時間。 此檢查可確保作業 (例如啟動、關機或擴增) 只會在特定時間執行。
注意
Azure 沙箱程序的本地時間會設定為 UTC。 您 Runbook 中的日期和時間計算必須考慮這一點。
在 Runbook 中重試邏輯,以避免暫時性失敗。
Runbook 通常會透過 ARM、Azure Resource Graph、SQL 服務和其他 Web 服務呼叫遠端系統 (例如 Azure)。 當 Runbook 呼叫的系統忙碌、暫時無法使用或實作負載下節流時,呼叫很容易發生執行階段錯誤。 若要在 Runbook 中建置復原功能,必須在進行呼叫時實作重試邏輯,以便 Runbook 可以處理暫時性問題,不會出現失敗。
如需詳細資訊,請參閱重試模式和一般 REST 和重試指引。
範例 1:如果您的 Runbook 只進行一或兩次呼叫
$searchServiceURL = "https://$searchServiceName.search.windows.net"
$resource = Get-AzureRmResource -ResourceType "Microsoft.Search/searchServices" -ResourceGroupName $searchResourceGroupName -ResourceName $searchServiceName -ApiVersion 2015-08-19
$searchAPIKey = (Invoke-AzureRmResourceAction -Action listAdminKeys -ResourceId $resource.ResourceId -ApiVersion 2015-08-19 -Force).PrimaryKey
當您呼叫 Invoke-AzureRmResourceAction
時,可能會發現暫時性失敗。 在這種情況下,建議您在呼叫 Cmdlet 時實作下列基本模式。
$searchServiceURL = "https://$searchServiceName.search.windows.net"
$resource = Get-AzureRmResource -ResourceType "Microsoft.Search/searchServices" -ResourceGroupName $searchResourceGroupName -ResourceName $searchServiceName -ApiVersion 2015-08-19
# Adding in a retry
$Stoploop = $false
$Retrycount = 0
do {
try {
$searchAPIKey = (Invoke-AzureRmResourceAction -Action listAdminKeys -ResourceId $resource.ResourceId -ApiVersion 2015-08-19 -Force).PrimaryKey
write-verbose "Invoke-AzureRmResourceAction on $resource.ResourceId completed"
$Stoploop = $true
}
catch {
if ($Retrycount -gt 3)
{
Write-verbose "Could not Invoke-AzureRmResourceAction on $resource.ResourceId after 3 retrys."
$Stoploop = $true
}
else
{
Write-verbose "Could not Invoke-AzureRmResourceAction on $resource.ResourceId retrying in 30 seconds..."
Start-Sleep -Seconds 30
$Retrycount = $Retrycount + 1
}
}
}
While ($Stoploop -eq $false)
注意
重試呼叫的嘗試最多三次,每次持續 30 秒。
範例 2:如果 Runbook 進行頻繁的遠端呼叫
如果 Runbook 進行頻繁的遠端呼叫,則可能會遇到暫時性執行階段問題。 建立函式,針對所進行的每個呼叫實作重試邏輯,並傳遞要作為指令區塊執行的呼叫。
Function ResilientRemoteCall {
param(
$scriptblock
)
$Stoploop = $false
$Retrycount = 0
do {
try {
Invoke-Command -scriptblock $scriptblock
write-verbose "Invoked $scriptblock completed"
$Stoploop = $true
}
catch {
if ($Retrycount -gt 3)
{
Write-verbose "Invoked $scriptblock failed 3 times and we will not try again."
$Stoploop = $true
}
else
{
Write-verbose "Invoked $scriptblock failed retrying in 30 seconds..."
Start-Sleep -Seconds 30
$Retrycount = $Retrycount + 1
}
}
}
While ($Stoploop -eq $false)
}
然後,您可以將每個遠端呼叫傳遞至函式,作為
ResilientRemoteCall { Get-AzVm }
或
ResilientRemoteCall { $searchAPIKey = (Invoke-AzureRmResourceAction -Action listAdminKeys -ResourceId $resource.ResourceId -ApiVersion 2015-08-19 -Force).PrimaryKey}
使用多個訂用帳戶
您的 Runbook 必須能夠搭配訂用帳戶運作。 例如,若要處理多個訂用帳戶,Runbook 會使用 Disable-AzContextAutosave \(英文\) Cmdlet。 此 Cmdlet 可確保系統不會從在相同沙箱中執行的另一個 Runbook 擷取驗證內容。
# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process
# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context
# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
-DefaultProfile $AzureContext
$childRunbookName = 'childRunbookDemo'
$resourceGroupName = "resourceGroupName"
$automationAccountName = "automationAccountName"
$startParams = @{
ResourceGroupName = $resourceGroupName
AutomationAccountName = $automationAccountName
Name = $childRunbookName
DefaultProfile = $AzureContext
}
Start-AzAutomationRunbook @startParams
如果您想要 Runbook 以系統指派的受控識別來執行,請將程式碼保持原狀。 如果您偏好使用使用者指派的受控識別,則:
- 從第 5 行移除
$AzureContext = (Connect-AzAccount -Identity).context
、 - 將其取代為
$AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context
,然後 - 輸入用戶端識別碼。
使用自訂指令碼
注意
您通常無法在已安裝 Log Analytics 代理程式的主機上執行自訂指令碼和 Runbook。
使用自訂指令碼:
- 建立自動化帳戶。
- 部署混合式 Runbook 背景工作角色。
- 如果在 Linux 機器上,您需要提高的權限。 登入以關閉簽章檢查。
測試 Runbook
當您測試 Runbook 時, 草稿版本 會執行,而且它執行的任何動作都會完成。 不會建立任何工作歷程記錄,但 [測試輸出] 窗格中會顯示輸出與警告和錯誤串流。 只有將 VerbosePreference 變數設定為 Continue
,傳送給詳細資訊串流的訊息才會顯示在 [輸出] 窗格中。
即使執行的是草稿版本,Runbook 仍會正常執行,並對環境中的資源執行任何動作。 因此,您只應在非生產資源中測試 Runbook。
注意
所有 Runbook 執行動作都會記錄在自動化帳戶的活動記錄中,並使用建立 Azure 自動化作業作為作業名稱。 不過,在執行 Runbook 草稿版本的測試窗格中,Runbook 的執行會記錄在作業名稱為寫入 Azure 自動化 Runbook 草稿的活動記錄中。 選取 [作業] 和 [JSON] 索引標籤,可查看以 ../runbooks/(runbook name)/draft/testjob 結尾的範圍。
測試每個 Runbook 類型的程序都相同。 無論是在文字式編輯器或 Azure 入口網站的圖形化編輯器中進行測試,都沒有任何差別。
- 您可以在文字編輯器或圖形化編輯器中開啟 Runbook 的草稿版本。
- 按一下 [測試] 以開啟 [測試] 頁面。
- 如果 Runbook 有參數,其會列在左窗格中,您可以在此提供用於測試的值。
- 如果您想要在混合式 Runbook 背景工作角色上執行測試,請將 [執行設定] 變更為 [混合式背景工作角色],然後選取目標群組的名稱。 否則,請保留預設值 Azure,以便在雲端中執行測試。
- 按一下 [開始] 以開始測試。
- 您可以使用 [輸出] 窗格下的按鈕來停止或暫止測試中的 PowerShell 工作流程或圖形化 Runbook。 暫停 Runbook 時,它會先完成目前的活動後才暫停。 暫停 Runbook 後,您可以停止或重新啟動它。
- 您可以在 [輸出] 窗格中檢查 Runbook 的輸出。
發行 Runbook
建立或匯入新的 Runbook 後,您必須發佈 Runbook 才能執行它。 Azure 自動化中的每個 Runbook 都有草稿版本和已發行版本。 只有已發佈版本可執行,且只有草稿版本可供編輯。 已發佈版本不受草稿版本的任何變更影響。 草稿版本應該已可供使用時,您會加以發佈,以草稿版本覆寫目前的已發佈版本。
在 Azure 入口網站中發行 Runbook
- 在 Azure 入口網站中,搜尋並選取 [自動化帳戶]。
- 在自動化帳戶分頁上,從清單中選取您的自動化帳戶。
- 在您的自動化帳戶中開啟 Runbook。
- 按一下 [編輯] 。
- 按一下 [發佈],然後選取 [是] 來回應驗證訊息。
使用 PowerShell 發佈 Runbook
您可以使用 Publish-AzAutomationRunbook Cmdlet 來發佈 Runbook。
$accountName = "MyAutomationAccount"
$runbookName = "Sample_TestRunbook"
$rgName = "MyResourceGroup"
$publishParams = @{
AutomationAccountName = $accountName
ResourceGroupName = $rgName
Name = $runbookName
}
Publish-AzAutomationRunbook @publishParams
在 Azure 入口網站中排程 Runbook
當您的 Runbook 發佈之後,您可以針對作業加以排程:
- 在 Azure 入口網站中,搜尋並選取 [自動化帳戶]。
- 在自動化帳戶分頁上,從清單中選取您的自動化帳戶。
- 從 Runbook 清單中選取 Runbook。
- 選取 [資源] 底下的 [排程]。
- 然後選取 [新增排程]。
- 在 [排程 Runbook] 窗格中,選取 [將排程連結至 Runbook]。
- 選擇 [排程] 窗格中的 [建立新排程]。
- 在 [新增排程] 窗格中輸入名稱、描述和其他參數。
- 建立排程之後,請加以反白,然後按一下 [確定]。 其現在應該已連結至您的 Runbook。
- 尋找您信箱中通知您 Runbook 狀態的電子郵件。
還原已刪除的 Runbook
您可以透過 PowerShell 指令碼復原已刪除的 Runbook。 若要復原 Runbook,請確認符合下列條件:
- 要還原的 Runbook 是在過去 29 天內刪除。
- 該 Runbook 的自動化帳戶存在。
- 自動化參與者角色權限已授與自動化帳戶的系統指派受控識別。
PowerShell 指令碼
- 在自動化帳戶中以作業形式執行 PowerShell 指令碼,還原已刪除的 Runbook。
- 從 GitHub 下載 PowerShell 指令碼。 或者,您也可以從 Runbook 資源庫匯入 名為還原自動化 Runbook 的 PowerShell 指令碼。 提供要還原的 Runbook 名稱,並在 Azure 自動化中以作業形式執行,還原已刪除的 Runbook。
- 從 GitHub 下載指令碼,或從 Runbook 資源庫匯入名為列出已刪除的自動化 Runbook PowerShell 指令碼,以識別在過去 29 天內刪除的 Runbook 名稱。
取得作業狀態
在 Azure 入口網站中檢視狀態
作業中提供 Azure 自動化中工作處理的詳細資料。 當您準備好查看 Runbook 作業時,請使用 Azure 入口網站並存取您的自動化帳戶。 在右邊,您可以在 [作業統計資料] 圖格下方,看到所有 Runbook 作業的摘要。
摘要會針對已執行的每個作業顯示作業狀態的計數和圖形表示。
按一下圖格,即會顯示 [作業] 頁面,其中包含所有已執行作業的摘要清單。 此頁面會顯示每個作業的狀態、Runbook 名稱、開始時間和完成時間。
您可以藉由選取 [篩選作業] 來篩選作業清單。 篩選特定的 Runbook、作業狀態,或從下拉式清單中選擇,並提供搜尋的時間範圍。
或者,您可以檢視特定 Runbook 的作業摘要詳細資料,方法是在您的自動化帳戶中,從 [Runbook] 頁面中選取該 Runbook,然後選取 [作業]。 此動作會顯示 [作業] 頁面。 您可以從此處按一下作業記錄,以檢視其詳細資料和輸出。
使用 PowerShell 擷取作業狀態
使用 Get-AzAutomationJob Cmdlet 擷取針對 Runbook 建立的工作以及特定工作的詳細資料。 如果您使用 Start-AzAutomationRunbook
啟動 Runbook,其會傳回產生的作業。 使用 Get-AzAutomationJobOutput 來擷取作業輸出。
下列範例會針對範例 Runbook 取得上一個作業並顯示其狀態、提供給 Runbook 參數的值,以及作業輸出。
$getJobParams = @{
AutomationAccountName = 'MyAutomationAccount'
ResourceGroupName = 'MyResourceGroup'
Runbookname = 'Test-Runbook'
}
$job = (Get-AzAutomationJob @getJobParams | Sort-Object LastModifiedDate -Desc)[0]
$job | Select-Object JobId, Status, JobParameters
$getOutputParams = @{
AutomationAccountName = 'MyAutomationAccount'
ResourceGroupName = 'MyResourceGroup'
Id = $job.JobId
Stream = 'Output'
}
Get-AzAutomationJobOutput @getOutputParams
下列範例會擷取特定作業的輸出,並傳回每一筆記錄。 如果其中一個記錄有例外狀況,則指令碼會寫入例外狀況,而不是值。 此行為非常有用,因為例外狀況可以提供通常可能不會在輸出期間記錄的額外資訊。
$params = @{
AutomationAccountName = 'MyAutomationAccount'
ResourceGroupName = 'MyResourceGroup'
Stream = 'Any'
}
$output = Get-AzAutomationJobOutput @params
foreach ($item in $output) {
$jobOutParams = @{
AutomationAccountName = 'MyAutomationAccount'
ResourceGroupName = 'MyResourceGroup'
Id = $item.StreamRecordId
}
$fullRecord = Get-AzAutomationJobOutputRecord @jobOutParams
if ($fullRecord.Type -eq 'Error') {
$fullRecord.Value.Exception
} else {
$fullRecord.Value
}
}
下一步
- 如需範例查詢,請參閱工作記錄和工作串流的範例查詢
- 若要了解 Runbook 管理的詳細資料,請參閱 Azure 自動化中的 Runbook 執行。
- 若要準備 PowerShell Runbook,請參閱在 Azure 自動化中編輯文字式 Runbook。
- 若要疑難排解 Runbook 執行的問題,請參閱為 Runbook 問題疑難排解。