共用方式為


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

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

在本文中,我們會建立 PowerShell Runbook,以使用儲存在 Azure 儲存體 中的 Resource Manager 範本來部署新的 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')]"
      }
  }
}

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

使用 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 指令碼,從 storageTemplate.json Azure 儲存體取得檔案,並部署範本以建立新的 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

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

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

Get-AzStorageAccount

後續步驟