SÅDAN FUNGERER DET

Sæt TerraProvider op i din tenant og pipeline.

Det en ingeniør skal vide, når TerraProvider sættes op: hvordan det logger ind, hvilke tilladelser det beder om, hvad den første plan ser ud som, og hvordan en eksisterende tenant kommer under kode.

  • terraprovider/microsoft365wp
  • Terraform and OpenTofu
  • 10 builds
  • version 0.20.2
OPSÆTNING

Din første plan i fire trin

Omtrent det samme som at sætte enhver anden Azure-provider op, fordi login fungerer på samme måde.

  1. Registrer en app i Entra ID.

    Single tenant, ingen redirect-URI nødvendig. Notér applikationens (client) ID og katalogets (tenant) ID.
  2. Tildel Graph-tilladelser.

    Tilføj applikationstilladelserne for de objekter, du vil administrere (se tabellen nedenfor), og giv admin consent.
  3. Deklarér provideren.

    Sæt ARM_TENANT_ID og ARM_CLIENT_ID, samt ARM_CLIENT_SECRET til en første test. Brug OpenID Connect i en pipeline i stedet (se nedenfor).
    main.tf
    terraform {  required_providers {    microsoft365wp = {      source = "terraprovider/microsoft365wp"    }  }}provider "microsoft365wp" {}
  4. Plan.

    Skriv én ressource, f.eks. en compliancepolitik, og kør terraform plan eller tofu plan. Der ændres ingenting i tenanten, før du anvender planen.
    compliance.tf
    resource "microsoft365wp_device_compliance_policy" "windows_defender" {  display_name = "Windows - Defender for Endpoint"  windows10 = {    device_threat_protection_enabled = true  }  scheduled_actions_for_rule = [{    scheduled_action_configurations = [{      action_type        = "block"      grace_period_hours = 6    }]  }]  assignments = [{    target = { all_licensed_users = {} }  }]}

    Eksempeldata.

TILLADELSER

De Graph-tilladelser det beder om

Applikationstilladelser, tildelt med admin consent. Tildel kun dem, der gælder for de objekter, du administrerer. En ressource, der ikke er opført her, angiver sine tilladelser på sin egen dokumentationsside.

De Graph-tilladelser det beder om
TilladelseHvad den giver adgang til
DeviceManagementConfiguration.ReadWrite.AllIntune enhedskonfiguration og politikker
DeviceManagementApps.ReadWrite.AllIntune apps
DeviceManagementServiceConfig.ReadWrite.AllIntune servicekonfiguration, f.eks. enrollment
Policy.ReadWrite.ConditionalAccessPolitikker for Conditional Access
Policy.Read.AllLæsning af organisationens politikker
Application.ReadWrite.AllApplikationer
Directory.ReadWrite.AllKatalogdata
Group.ReadWrite.AllGrupper
User.ReadWrite.AllBrugernes fulde profiler
CloudPC.ReadWrite.AllWindows 365-konfiguration

Kilde: providerens guide "Configuring a Service Principal for managing EntraID".

LOGIN

De samme login-indstillinger som azuread-provideren

Provideren læser de samme ARM_*-indstillinger som azuread-provideren. Sæt ARM_TENANT_ID og ARM_CLIENT_ID, og vælg derefter én metode.

De samme login-indstillinger som azuread-provideren
MetodePasser tilSlå til
OpenID Connect, GitHub ActionsWorkflows uden en gemt hemmelighedARM_USE_OIDC=true
OpenID Connect, Azure DevOpsPipelines med en serviceforbindelseARM_USE_OIDC=true
ARM_ADO_PIPELINE_SERVICE_CONNECTION_ID
OpenID Connect, enhver udstederAndre CI-systemer, der udsteder et ID-tokenARM_USE_OIDC=true
ARM_OIDC_TOKEN / ARM_OIDC_TOKEN_FILE_PATH
KlientcertifikatRunners, der har et certifikatARM_CLIENT_CERTIFICATE / ARM_CLIENT_CERTIFICATE_PATH
KlienthemmelighedEn første test, et labARM_CLIENT_SECRET / ARM_CLIENT_SECRET_FILE_PATH
Managed identityRunners på AzureARM_USE_MSI=true
AKS workload identityRunners på Kubernetes i AzureARM_USE_AKS_WORKLOAD_IDENTITY=true
Azure CLIDin laptopslået til som standard; ARM_USE_CLI=false deaktiverer det

Hver indstilling findes også som et provider-argument (use_oidc, client_certificate_path osv.). Providerens OpenID Connect-guide viser, hvordan Entra ID kan konfigureres til at stole på et GitHub-repository. Kort fortalt: OpenID Connect (GitHub Actions, Azure DevOps, ethvert OIDC-token), klientcertifikat, klienthemmelighed, managed identity, AKS workload identity, Azure CLI.

Fire clouds

Sæt environment eller ARM_ENVIRONMENT. Provideren kommunikerer derefter med det pågældende clouds Microsoft Graph-endpoint: global, US Government L4, US Government L5 (DoD), China.

Miljø

global (også public)
Det kommercielle cloud, standardvalget
usgovernmentl4 (også usgovernment)
US Government L4
usgovernmentl5 (også dod)
US Government L5 (DoD)
china
Microsofts cloud i Kina
Dit eget endpoint
metadata_host or ARM_METADATA_HOSTNAME
DRIFT

Hvad planen overvåger

Terraform sammenligner din konfiguration med det, tenanten rapporterer. TerraProvider sørger for, at den sammenligning dækker hele objektet: enhver attribut, du ikke sætter, får en standardværdi hentet fra det, Microsoft-portalerne sender, når du opretter det samme objekt der. Derfor vises en udelukkelse, der er tilføjet en politik i portalen, en kontakt der er skiftet i Intune Admin Center, eller en indstilling ændret af et script, i den næste plan, uanset om din fil nævner det eller ej.
  • Samlinger, du udelader, får tom som standard, så et tilføjet medlem, en udelukkelse eller en app er synlig.
  • En ny Conditional Access-politik uden en tilstand oprettes som enabledForReportingButNotEnforced.
  • Standardværdien for hver attribut fremgår af ressourcens dokumentationsside, markeret som provider default.

Bagsiden af medaljen: en indstilling, som nogen har slået til og fra igen i en portal, kan dukke op som false i stedet for ikke-sat og vises én gang som en ændring. Én apply løser det.

I portalen: Ingen ændringer siden sidste apply.

microsoft365wp_conditional_access_policy.require_mfa_admins: Refreshing state... [id=2b7f9c3e-8d41-4f6a-b0e2-5c9a1d7e3f80]No changes. Your infrastructure matches the configuration.
Eksempeldata.
EKSISTERENDE TENANT

Eksportér og importér en eksisterende tenant i to faser

Quickstart-repositoryet indeholder en referencekonfiguration med moduler, GitHub Actions-workflows og en PowerShell-eksport. Eksporten arbejder i to faser, fordi politikker refererer til grupper og filtre.

  1. Eksportér grupper, filtre og notifikationsskabeloner.

    De skrives ind i quickstartets moduler med en mapping-fil for hver type. Mail-aktiverede grupper udelades, medmindre du eksplicit beder om dem.
  2. Importér dem.

    Værktøjet kalder Terraform eller OpenTofu for at importere hvert eksporteret objekt til state.
  3. Eksportér compliance- og konfigurationspolitikker.

    Indstillingskatalog og endpoint security-politikker tæller som konfigurationspolitikker. Hver eksport gemmer også et råt JSON-dump af det, Graph returnerede.
  4. Importér dem.

    Samme værktøj, anden fase.
  5. Plan.

    Planen viser, hvad der stadig afviger. Ikke alle attributter kan eksporteres, så forvent en kortere oprydning, inden den første rene plan er opnået.

Ét objekt ad gangen

For alt, hvad eksporten ikke dækker, skriver et lille script en Terraform-fil for ét objekt af en hvilken som helst ressourcetype ud fra dets id. Det bruger Terraforms egen konfigurationsgenerering, så filen indeholder præcis det, provideren selv læser fra tenanten.

Quickstart på GitHub
APPS

Én ressource rummer appen, dens pakke og dens tildelinger

microsoft365wp_mobile_app dækker 21 app-typer. For .intunewin, MSI, APPX/MSIX, DMG, PKG pakker krypterer provideren filen og uploader den til Intune, og det sker kun igen, når source_sha256 ændres. Tildelinger ligger i samme ressource: alle enheder, alle licenserede brugere, en gruppe eller en udelukkelsesgruppe, hver med et include- eller exclude-filter.
locals {  agent_package = "${path.module}/packages/contoso-agent-4.2.1.intunewin"  agent_meta    = provider::microsoft365wp::parse_intunewin_metadata(local.agent_package)}resource "microsoft365wp_mobile_app" "contoso_agent" {  display_name = "Contoso Agent"  publisher    = "Contoso"  win32_lob = {    file_name              = local.agent_meta.file_name    setup_file_path        = local.agent_meta.setup_file    install_command_line   = "setup.exe /quiet"    uninstall_command_line = "setup.exe /uninstall /quiet"    detection_rules = [{      filesystem = {        detection_type      = "exists"        path                = "C:\\Program Files\\Contoso\\Agent"        file_or_folder_name = "agent.exe"      }    }]    source_file   = local.agent_package    source_sha256 = filesha256(local.agent_package)  }  assignments = [{    target   = { group = { group_id = "3d9b2f61-7a4e-4c18-9e05-6f2a8b1c4d93" } }    settings = { win32_lob = {} }  }]}

Eksempeldata.

  • Windows

    Win32 (.intunewin), MSI, APPX/MSIX, Microsoft Store (ny, via WinGet), Microsoft Store (ældre), Microsoft Edge, Microsoft 365 Apps, weblinks.

  • macOS

    DMG, PKG, Microsoft Edge, Microsoft Defender, Microsoft 365 Apps, webklip.

  • iOS og iPadOS

    App Store-apps, administrerede iOS Store-apps, webklip.

  • Android

    Google Play Store-apps, administrerede Google Play-apps, administrerede Android Store-apps.

  • Enhver platform

    Weblinks.

TENANTS

Flere tenants fra ét repository

En provider-blok logger ind til én tenant. For flere tenants deklarerer du én blok per tenant med et alias og dens tenant_id, skriver baseline som et modul og kalder det én gang per tenant. Hver blok logger ind for sig selv, så hver tenant kan have sit eget service principal med sine egne tilladelser.
  • Forskelle mellem tenants er modulvariabler, der er synlige i gennemgangen.
  • En ny tenant er én provider-blok, ét modulkald og én plan.
main.tf
provider "microsoft365wp" {  alias     = "contoso"  tenant_id = "8a1f3c2e-5b7d-4e90-a6c4-2d9e7f1b0c35"}provider "microsoft365wp" {  alias     = "fabrikam"  tenant_id = "e4c27b91-0d3a-4f86-b5e2-7a1c9d0f6b48"}module "baseline_contoso" {  source    = "./baseline"  providers = { microsoft365wp = microsoft365wp.contoso }}module "baseline_fabrikam" {  source     = "./baseline"  providers  = { microsoft365wp = microsoft365wp.fabrikam }  allow_byod = true}

Eksempeldata.

Sådan håndterer det Graph-throttling

Microsoft Graph begrænser, hvor mange forespørgsler en klient må sende, og en plan over en stor tenant sender mange. Provideren venter og forsøger igen på egen hånd.

Genforsøg

Genforsøg pr. forespørgsel
op til 10
Ventetid mellem genforsøg
3 til 60 sekunder
En Retry-After på nul
Forlænges til backoff-intervallet, fordi Graph ofte svarer sådan, og et øjeblikkeligt genforsøg sjældent hjælper

Start med quickstart.

Klon det, peg det mod en test-tenant, og kør en plan. Community Edition er gratis for organisationer med op til 99 brugere.