Развертывание шаблона Azure Resource Manager в 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 на портале 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

Дальнейшие шаги