Dela via


Distribuera en Azure Resource Manager-mall i en Automation PowerShell-runbook

Du kan skriva en Automation PowerShell-runbook som distribuerar en Azure-resurs med hjälp av en Azure Resource Manager-mall. Med mallar kan du använda Azure Automation för att automatisera distributionen av dina Azure-resurser. Du kan underhålla dina Resource Manager mallar på en central och säker plats, till exempel Azure Storage.

I den här artikeln skapar vi en PowerShell-runbook som använder en Resource Manager-mall som lagras i Azure Storage för att distribuera ett nytt Azure Storage-konto.

Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Förutsättningar

Tilldela behörigheter till hanterade identiteter

Tilldela behörigheter till de hanterade identiteterna för att utföra lagringsrelaterade uppgifter i Runbook.

  1. Logga in på Azure interaktivt med cmdleten Anslut-AzAccount och följ anvisningarna.

    # 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. Ange ett lämpligt värde för variablerna nedan och kör sedan skriptet.

    $resourceGroup = "resourceGroup"
    $automationAccount = "automationAccount"
    $storageAccount = "storageAccount"
    $userAssignedManagedIdentity = "userAssignedManagedIdentity"
    $storageTemplate = "path\storageTemplate.json"
    $runbookScript = "path\runbookScript.ps1"
    
  3. Tilldela rollen reader till den systemtilldelade hanterade identiteten för att köra cmdleten Get-AzUserAssignedIdentity.

    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  4. Tilldela rollen Storage Account Contributor till den användartilldelade hanterade identiteten för åtgärder mot lagringskontot.

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

Skapa Resource Manager-mallen

I det här exemplet använder du en Resource Manager-mall som distribuerar ett nytt Azure Storage-konto. Skapa en lokal fil med namnet storageTemplate.json och klistra sedan in följande kod:

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

Spara mallen Resource Manager i Azure Files

Använd PowerShell för att skapa en Azure-filresurs och ladda upp storageTemplate.json. Anvisningar om hur du skapar en filresurs och laddar upp en fil i Azure-portalen finns i Komma igång med Azure Files i Windows.

Kör följande kommandon för att skapa en filresurs och ladda upp Resource Manager-mallen till filresursen.

# 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

Skapa PowerShell-runbookskriptet

Skapa ett PowerShell-skript som hämtar storageTemplate.json filen från Azure Storage och distribuerar mallen för att skapa ett nytt Azure Storage-konto. Skapa en lokal fil med namnet runbookScript.ps1 och klistra sedan in följande kod:

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 

Importera och publicera runbooken till ditt Azure Automation-konto

Använd PowerShell för att importera runbooken till ditt Automation-konto och publicera sedan runbooken. Information om hur du importerar och publicerar runbooks i Azure-portalen finns i Hantera runbooks i Azure Automation.

Om du vill importera runbookScript.ps1 till ditt Automation-konto som en PowerShell-runbook kör du följande PowerShell-kommandon:

$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

Starta runbook

Nu startar vi runbooken genom att anropa cmdleten Start-AzAutomationRunbook . Information om hur du startar en runbook i Azure-portalen finns i Starta en runbook i Azure Automation.

Kör följande kommandon i PowerShell-konsolen:

# 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

När runbooken har körts kan du kontrollera dess status genom att hämta egenskapsvärdet för jobbobjektet $job.Status.

Runbooken hämtar Resource Manager-mallen och använder den för att distribuera ett nytt Azure Storage-konto. Du kan se att det nya lagringskontot skapades genom att köra följande kommando:

Get-AzStorageAccount

Nästa steg