在自動化 PowerShell Runbook 中部署 Azure Resource Manager 範本

您可以使用 Azure Resource Manager 範本,來撰寫可部署 Azure 資源的自動化 PowerShell Runbook。 範本可讓您使用 Azure 自動化來自動部署 Azure 資源。 您可以在一個中央安全位置 (例如 Azure 儲存體) 維護 Resource Manager 範本。

在此文章中,我們會建立使用儲存在 Azure 儲存體中 Resource Manager 範本的 PowerShell Runbook,來部署新的 Azure 儲存體帳戶。

如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

必要條件

將權限指派給受控識別

將權限指派給受控識別,以在 Runbook 中執行儲存體相關工作。

  1. 使用 Connect-AzAccount cmdlet 以互動方式登入 Azure 並遵循指示。

    # Sign in to your Azure subscription
    $sub = Get-AzSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Connect-AzAccount
    }
    
    # If you have multiple subscriptions, set the one to use
    # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
    
  2. 為下列變數提供適當的值,然後執行指令碼。

    $resourceGroup = "resourceGroup"
    $automationAccount = "automationAccount"
    $storageAccount = "storageAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    $storageTemplate = "path\storageTemplate.json"
    $runbookScript = "path\runbookScript.ps1"
    
  3. 將角色 reader 指派給系統指派的受控識別,以執行 Cmdlet Get-AzUserAssignedIdentity

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  4. 針對儲存體帳戶的動作,將角色 Storage Account Contributor 指派給使用者指派的受控識別。

    $UAMI_ID = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI_ID `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Storage Account Contributor"
    

建立 Resource Manager 範本

在此範例中,您會使用可部署新 Azure 儲存體帳戶的 Resource Manager 範本。 建立名為 storageTemplate.json 的本機檔案,然後貼上以下程式碼:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ],
      "metadata": {
        "description": "Storage Account type"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "apiVersion": "2018-02-01",
      "location": "[parameters('location')]",
      "sku": {
          "name": "[parameters('storageAccountType')]"
      },
      "kind": "Storage", 
      "properties": {
      }
    }
  ],
  "outputs": {
      "storageAccountName": {
          "type": "string",
          "value": "[variables('storageAccountName')]"
      }
  }
}

在 Azure 檔案儲存體中儲存 Resource Manager 範本

使用 PowerShell 來建立 Azure 檔案共用,並上傳 storageTemplate.json。 如需如何在 Azure 入口網站建立檔案共用並上傳檔案的指示,請參閱在 Windows 上開始使用 Azure 檔案儲存體

執行下列命令來建立檔案共用,並將 Resource Manager 範本上傳至該檔案共用。

# Get the access key for your storage account
$key = Get-AzStorageAccountKey -ResourceGroupName $resourceGroup -Name $storageAccount

# Create an Azure Storage context using the first access key
$context = New-AzStorageContext -StorageAccountName $storageAccount -StorageAccountKey $key[0].value

# Create a file share named 'resource-templates' in your Azure Storage account
$fileShare = New-AzStorageShare -Name 'resource-templates' -Context $context

# Add the storageTemplate.json file to the new file share
Set-AzStorageFileContent -ShareName $fileShare.Name -Context $context -Source $storageTemplate

建立 PowerShell Runbook 指令碼

建立 PowerShell 指令碼,其會從 Azure 儲存體取得 storageTemplate.json 檔案,並部署範本來建立新的 Azure 儲存體帳戶。 建立名為 runbookScript.ps1 的本機檔案,然後貼上以下程式碼:

param (
    [Parameter(Mandatory=$true)]
    [string]
    $resourceGroup,

    [Parameter(Mandatory=$true)]
    [string]
    $storageAccount,

    [Parameter(Mandatory=$true)]
    [string]
    $storageAccountKey,

    [Parameter(Mandatory=$true)]
    [string]
    $storageFileName,

    [Parameter(Mandatory=$true)]
    [string]
    $userAssignedManagedIdentity
)

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with user-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context
$identity = Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup `
    -Name $userAssignedManagedIdentity `
    -DefaultProfile $AzureContext
$AzureContext = (Connect-AzAccount -Identity -AccountId $identity.ClientId).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
    -DefaultProfile $AzureContext

#Set the parameter values for the Resource Manager template
$Parameters = @{
    "storageAccountType"="Standard_LRS"
    }

# Create a new context
$Context = New-AzStorageContext -StorageAccountName $storageAccount -StorageAccountKey $storageAccountKey

Get-AzStorageFileContent `
    -ShareName 'resource-templates' `
    -Context $Context `
    -path 'storageTemplate.json' `
    -Destination 'C:\Temp' -Force

$TemplateFile = Join-Path -Path 'C:\Temp' -ChildPath $storageFileName

# Deploy the storage account
New-AzResourceGroupDeployment `
    -ResourceGroupName $resourceGroup `
    -TemplateFile $TemplateFile `
    -TemplateParameterObject $Parameters 

將 Runbook 匯入您的 Azure 自動化帳戶並加以發佈

使用 PowerShell 將 Runbook 匯入您的自動化帳戶,然後發佈 Runbook。 若要了解如何在 Azure 入口網站匯入並發佈 Runbook,請參閱在 Azure 自動化中管理 Runbook

若要將 runbookScript.ps1 匯入您的自動化帳戶中作為 PowerShell Runbook,請執行下列 PowerShell 命令:

$importParams = @{
    Path = $runbookScript
    ResourceGroupName = $resourceGroup
    AutomationAccountName = $automationAccount
    Type = "PowerShell"
}
Import-AzAutomationRunbook @importParams

# Publish the runbook
$publishParams = @{
    ResourceGroupName = $resourceGroup
    AutomationAccountName = $automationAccount
    Name = "runbookScript"
}
Publish-AzAutomationRunbook @publishParams

啟動 Runbook

現在,我們呼叫 Start-AzAutomationRunbook Cmdlet 來啟動 Runbook。 如需關於如何在 Azure 入口網站中啟動 Runbook 的資訊,請參閱在 Azure 自動化中啟動 Runbook

在 PowerShell 主控台中執行下列命令:

# Set up the parameters for the runbook
$runbookParams = @{
    resourceGroup = $resourceGroup
    storageAccount = $storageAccount
    storageAccountKey = $key[0].Value # We got this key earlier
    storageFileName = "storageTemplate.json"
    userAssignedManagedIdentity = $userAssignedManagedIdentity
}

# Set up parameters for the Start-AzAutomationRunbook cmdlet
$startParams = @{
    resourceGroup = $resourceGroup
    AutomationAccountName = $automationAccount
    Name = "runbookScript"
    Parameters = $runbookParams
}

# Start the runbook
$job = Start-AzAutomationRunbook @startParams

Runbook 執行之後,您可以擷取工作物件 $job.Status 的屬性值來檢查其狀態。

Runbook 會取得 Resource Manager 範本,並使用它來部署新的 Azure 儲存體帳戶。 您可以執行下列命令,以查看新建立的儲存體帳戶:

Get-AzStorageAccount

下一步