Развертывание шаблона Azure Resource Manager в runbook PowerShell службы автоматизации

Модуль Runbook PowerShell службы автоматизации, который развертывает ресурс Azure с помощью шаблона Azure Resource Manager. Шаблоны дают возможность использовать службу автоматизации Azure для автоматизации развертывания ресурсов Azure. Можно хранить шаблоны Resource Manager в центральном безопасном сетевом расположении, например в службе хранилища Azure.

В этой статье мы создадим runbook PowerShell, использующий шаблон Resource Manager, который расположен в службе хранилища Azure, для развертывания новой учетной записи хранения Azure.

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Необходимые компоненты

Назначение разрешений управляемым удостоверениям

Назначьте разрешения управляемым удостоверениям для выполнения задач, связанных с хранилищем в Runbook.

  1. Войдите в Azure в интерактивном режиме с помощью командлета Connect-AzAccount и следуйте инструкциям.

    # 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 управляемому удостоверению, назначаемого системой, для выполнения командлета 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

В этом примере используется шаблон Resource Manager, который развертывает новую учетную запись служба хранилища 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')]"
      }
  }
}

Сохранение шаблона Resource Manager в Файлах Azure

Используйте PowerShell для создания общей папки Azure и отправки storageTemplate.json. Инструкции по созданию общей папки и передаче файла на портале Azure см. в разделе Приступая к работе с файлами Azure в Windows.

Выполните следующие команды, чтобы создать общую папку и отправить шаблон 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

Создание скрипта runbook PowerShell

Создайте скрипт 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. Сведения об импорте и публикации модулей Runbook в портал Azure см. в разделе "Управление модулями Runbook" в служба автоматизации Azure.

Чтобы импортировать runbookScript.ps1 в свою учетную запись автоматизации как runbook PowerShell, выполните следующие команды 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

Теперь запустим runbook, вызвав командлет Start-AzAutomationRunbook. Сведения о том, как запустить runbook на портале Azure, см. в разделе Запуск модуля Runbook в службе автоматизации Azure.

В консоли 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

Следующие шаги