Distribuera en Azure Resource Manager i en Automation PowerShell-runbook

Du kan skriva en Automation PowerShell-runbook som distribuerar en Azure-resurs med hjälp av 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, säker plats, till exempel Azure Storage.

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

Om du inte har någon Azure-prenumeration kan du skapa 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 hjälp Anslut-AzAccount-cmdleten och följ instruktionerna.

    # 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 till reader den system tilldelade 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 till Storage Account Contributor den användar tilldelade 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 som distribuerar ett nytt Azure Storage konto. Skapa en lokal fil med storageTemplate.json namnet 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 Portal finns i Kom igång med Azure Files på Windows.

Kör följande kommandon för att skapa en filresurs och ladda upp Resource Manager mallen till den 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 filen Azure Storage och distribuerar mallen för storageTemplate.json att skapa ett nytt Azure Storage konto. Skapa en lokal fil med runbookScript.ps1 namnet 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 Portal finns i Hantera runbooks i Azure Automation.

Om du runbookScript.ps1 vill importera 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 Portal finns i Starting a runbook in 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 mallen Resource Manager och använder den för att distribuera ett nytt Azure Storage konto. Du kan se att det nya lagringskontot har skapats genom att köra följande kommando:

Get-AzStorageAccount

Nästa steg