Dela via


Snabbstart: Skapa en principtilldelning för att identifiera inkompatibla resurser med Terraform

Det första steget mot att förstå kompatibilitet i Azure är att identifiera dina resursers status. Den här snabbstarten beskriver hur du skapar en principtilldelning för att identifiera virtuella datorer som inte använder hanterade diskar.

När du tilldelar en inbyggd princip eller initiativdefinition är det valfritt att referera till en version. Principtilldelningar av inbyggda definitioner ställs som standard till den senaste versionen och ärver automatiskt mindre versionsändringar, om inte annat specificeras.

Terraform möjliggör definition, förhandsversion och distribution av molninfrastruktur. Med Terraform skapar du konfigurationsfiler med hjälp av HCL-syntax. Med HCL-syntaxen kan du ange molnleverantören – till exempel Azure – och de element som utgör din molninfrastruktur. När du har skapat konfigurationsfilerna skapar du en körningsplan som gör att du kan förhandsgranska ändringarna i infrastrukturen innan de distribueras. När du har verifierat ändringarna tillämpar du genomförandeplanen för att implementera infrastrukturen.

I den här artikeln lär du dig att:

  • Hämta den aktuella konfigurationen för Azure-klienten.
  • Skapa en Azure-resursgrupp med det genererade slumpmässiga namnet.
  • Skapa en prenumerationspolicytilldelning för att identifiera vilka virtuella maskiner som inte använder hanterade diskar

Förutsättningar

Implementera koden med Terraform

Exempelkoden för den här artikeln finns på Azure Terraform GitHub-lagringsplatsen. Du kan visa loggfilen som innehåller testresultaten från aktuella och tidigare versioner av Terraform. Se fler artiklar och exempelkod som visar hur du använder Terraform för att hantera Azure-resurser

  1. Skapa en katalog där du kan testa och köra Terraform-exempelkoden och göra den till den aktuella katalogen.

  2. Skapa en fil med namnet providers.tf och infoga följande kod.

    terraform {
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Skapa en fil med namnet main.tf och infoga följande kod.

    # Create a random pet name to ensure unique resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    # Create a resource group
    resource "azurerm_resource_group" "example" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Get the current subscription
    data "azurerm_subscription" "current" {}
    
    # Create a subscription policy assignment
    resource "azurerm_subscription_policy_assignment" "auditvms" {
      name                 = "audit-vm-manageddisks"
      subscription_id      = coalesce(var.scope, "/subscriptions/${data.azurerm_subscription.current.subscription_id}")
      policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d"
      description          = "Shows all virtual machines not using managed disks"
      display_name         = "Audit VMs without managed disks assignment"
    }
    
  4. Skapa en fil med namnet variables.tf och infoga följande kod.

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "scope" {
      type        = string
      default     = ""
      description = "Scope of the policy assignment."
    }
    
  5. Skapa en fil med namnet outputs.tf och infoga följande kod.

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "assignment_id" {
      value = azurerm_subscription_policy_assignment.auditvms.id
    }
    
    output "subscription_id" {
      value = data.azurerm_subscription.current.subscription_id
    }
    

Ange omfång

Ett omfång avgör vilka resurser eller grupper med resurser som principtilldelningen används i. Det kan sträcka sig från en hanteringsgrupp till en enskild resurs. Om du vill använda något av följande omfång uppdaterar du variabeln scopevariables.tf i filen. Om du lämnar scope variabelvärdet tomt används omfånget "prenumeration".

  • Prenumeration: /subscriptions/<subscription_id>
  • Resursgrupp: /subscriptions/<subscription_id>/resourceGroups/<resource_group_name>
  • Resurs: /subscriptions/<subscription_id>/resourceGroups/<resource_group_name>/providers/<resource_provider_namespace>/[{parentResourcePath}/]

Initiera Terraform

Viktigt!

Om du använder 4.x azurerm-providern måste du uttryckligen ange Azure-prenumerations-ID :t för att autentisera till Azure innan du kör Terraform-kommandona.

Ett sätt att ange Azure-prenumerations-ID:t utan att placera det i providers blocket är att ange prenumerations-ID:t i en miljövariabel med namnet ARM_SUBSCRIPTION_ID.

Mer information finns i referensdokumentationen för Azure-providern.

Kör terraform init för att initiera Terraform-distributionen. Det här kommandot laddar ned den Azure-provider som krävs för att hantera dina Azure-resurser.

terraform init -upgrade

Viktiga punkter:

  • Parametern -upgrade uppgraderar nödvändiga provider-plugin-program till den senaste versionen som uppfyller konfigurationens versionsbegränsningar.

Skapa en Terraform-utförandeplan

Kör terraform plan för att skapa en exekveringsplan.

terraform plan -out main.tfplan

Viktiga punkter:

  • Kommandot terraform plan skapar en utförandeplan, men utför den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om åtgärdsplanen stämmer överens med dina förväntningar innan du gör några ändringar i faktiska resurser.
  • Med den valfria parametern -out kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt vad som tillämpas.

Tillämpa en Terraform-utförandeplan

Kör terraform apply för att applicera exekveringsplanen på din molnmiljö.

terraform apply main.tfplan

Viktiga punkter:

  • terraform apply Exempelkommandot förutsätter att du tidigare körde terraform plan -out main.tfplan.
  • Om du har angett ett annat filnamn för parametern -out använder du samma filnamn i anropet till terraform apply.
  • Om du inte använde parametern -out anropar du terraform apply utan några parametrar.

Verifiera resultatet

  1. Hämta den _assignment\_id_ som returnerades av terraform apply.

  2. kör följande kommando för att visa de resurser som inte är kompatibla under den nya principtilldelningen.

    armclient post "/subscriptions/<subscription_id>/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$filter=IsCompliant eq false and PolicyAssignmentId eq '<policyAssignmentID>'&$apply=groupby((ResourceId))" > <json file to direct the output with the resource IDs into>
    
  3. Resultatet är jämförbart med det som visas under Icke-kompatibla resurser i Azure-portalvyn.

Rensa resurser

Gör följande när du inte längre behöver de resurser som skapats via Terraform:

  1. Kör terraform plan och ange destroy flaggan.

    terraform plan -destroy -out main.destroy.tfplan
    

    Viktiga punkter:

    • Kommandot terraform plan skapar en utförandeplan, men utför den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om åtgärdsplanen stämmer överens med dina förväntningar innan du gör några ändringar i faktiska resurser.
    • Med den valfria parametern -out kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt vad som tillämpas.
  2. Kör terraform apply för att tillämpa körningsplanen.

    terraform apply main.destroy.tfplan
    

Felsöka Terraform i Azure

Felsöka vanliga problem när du använder Terraform i Azure.

Nästa steg