你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在自动化 PowerShell Runbook 中部署 Azure 资源管理器模板

可以使用 Azure 资源管理器模板编写部署 Azure 资源的自动化 PowerShell Runbook。 借助模板可以通过 Azure 自动化来自动部署 Azure 资源。 可以在一个安全的中心位置(例如 Azure 存储)维护资源管理器模板。

在本文中,我们将创建一个 PowerShell Runbook,该 Runbook 使用存储在 Azure 存储 中的资源管理器模板来部署新的 Azure 存储帐户。

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

先决条件

  • 至少具有一个用户分配的托管标识的 Azure 自动化帐户。 有关详细信息,请参阅 为 Azure 自动化帐户使用用户分配的托管标识

  • Az 模块: Az.AccountsAz.ManagedServiceIdentityAz.ResourcesAz.Storage。 导入到自动化帐户中。 有关详细信息,请参阅导入 Az 模块

  • 要在其中存储资源管理器模板的 Azure 存储帐户

  • 安装在本地计算机上的 Azure PowerShell。 若要详细了解如何获得 Azure PowerShell,请参阅安装 Azure Powershell 模块。 还需要模块 Az.ManagedServiceIdentityAz.ManagedServiceIdentity 是预览模块,未作为 Az 模块的一部分安装。 若要安装它,请运行 Install-Module -Name Az.ManagedServiceIdentity

向托管身份分配权限

向托管标识分配权限,以在 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"
    

创建资源管理器模板

在此示例中,使用部署新 Azure 存储帐户的资源管理器模板。 创建名为 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 文件中保存资源管理器模板

使用 PowerShell 创建 Azure 文件共享并上传 storageTemplate.json。 有关如何在 Azure 门户中创建文件共享和上传文件的说明,请参阅 Windows 上的 Azure 文件入门

运行以下命令以创建文件共享并将资源管理器模板上传到该文件共享。

# 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 脚本

创建从 Azure 存储获取 storageTemplate.json 文件的 PowerShell 脚本,并部署模板以创建新的 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 

将运行手册导入并发布到您的 Azure 自动化帐户中

使用 PowerShell 将运行手册导入到自动化帐户中,然后发布运行手册。 有关在 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 获取资源管理器模板,并使用它来部署新的 Azure 存储帐户。 可以通过运行以下命令来查看新存储帐户是否已创建:

Get-AzStorageAccount

后续步骤