Een Azure Resource Manager-sjabloon implementeren in een Automation PowerShell-runbook

U kunt een Automation PowerShell-runbook schrijven waarmee een Azure-resource wordt geïmplementeerd met behulp van een Azure Resource Manager-sjabloon. Met sjablonen kunt u Azure Automation gebruiken om de implementatie van uw Azure-resources te automatiseren. U kunt uw Resource Manager-sjablonen onderhouden op een centrale, veilige locatie, zoals Azure Storage.

In dit artikel maken we een PowerShell-runbook dat gebruikmaakt van een Resource Manager-sjabloon die is opgeslagen in Azure Storage om een nieuw Azure Storage-account te implementeren.

Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Vereisten

Machtigingen toewijzen aan beheerde identiteiten

Wijs machtigingen toe aan de beheerde identiteiten om de opslaggerelateerde taken in het Runbook uit te voeren.

  1. Meld u interactief aan bij Azure met behulp van de cmdlet Verbinding maken-AzAccount en volg de instructies.

    # 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. Geef een geschikte waarde op voor de onderstaande variabelen en voer vervolgens het script uit.

    $resourceGroup = "resourceGroup"
    $automationAccount = "automationAccount"
    $storageAccount = "storageAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    $storageTemplate = "path\storageTemplate.json"
    $runbookScript = "path\runbookScript.ps1"
    
  3. Wijs de rol reader toe aan de door het systeem toegewezen beheerde identiteit om de cmdlet Get-AzUserAssignedIdentityuit te voeren.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  4. Wijs de rol Storage Account Contributor toe aan de door de gebruiker toegewezen beheerde identiteit voor acties voor het opslagaccount.

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

Het Resource Manager-sjabloon maken

In dit voorbeeld gebruikt u een Resource Manager-sjabloon waarmee een nieuw Azure Storage-account wordt geïmplementeerd. Maak een lokaal bestand met de naam storageTemplate.json en plak de volgende code:

{
  "$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')]"
      }
  }
}

De Resource Manager-sjabloon opslaan in Azure Files

Gebruik PowerShell om een Azure-bestandsshare te maken en te uploaden storageTemplate.json. Zie Aan de slag met Azure Files in Windows voor instructies over het maken van een bestandsshare en het uploaden van een bestand in Azure Portal.

Voer de volgende opdrachten uit om een bestandsshare te maken en de Resource Manager-sjabloon naar die bestandsshare te uploaden.

# 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

Het PowerShell-runbookscript maken

Maak een PowerShell-script waarmee het storageTemplate.json bestand wordt opgehaald uit Azure Storage en de sjabloon wordt geïmplementeerd om een nieuw Azure Storage-account te maken. Maak een lokaal bestand met de naam runbookScript.ps1 en plak de volgende code:

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 

Het runbook importeren en publiceren in uw Azure Automation-account

Gebruik PowerShell om het runbook te importeren in uw Automation-account en publiceer vervolgens het runbook. Zie Runbooks beheren in Azure Automation voor meer informatie over het importeren en publiceren van runbooks in Azure Portal.

Als u wilt importeren runbookScript.ps1 in uw Automation-account als een PowerShell-runbook, voert u de volgende PowerShell-opdrachten uit:

$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

Het runbook starten

Nu starten we het runbook door de cmdlet Start-AzAutomationRunbook aan te roepen. Zie Een runbook starten in Azure Automation voor meer informatie over het starten van een runbook in Azure Portal.

Voer de volgende opdrachten uit in de PowerShell-console:

# 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

Nadat het runbook is uitgevoerd, kunt u de status ervan controleren door de eigenschapswaarde van het taakobject $job.Statusop te halen.

Het runbook haalt de Resource Manager-sjabloon op en gebruikt deze om een nieuw Azure Storage-account te implementeren. U kunt zien dat het nieuwe opslagaccount is gemaakt door de volgende opdracht uit te voeren:

Get-AzStorageAccount

Volgende stappen