Applicare criteri delle risorse per i tag

Questo argomento fornisce regole di criterio comuni che è possibile applicare per garantire l'uso coerente dei tag delle risorse.

Applicando un criterio di tag a un gruppo di risorse o a una sottoscrizione con risorse esistenti non si applica retroattivamente il criterio a tali risorse. Per applicare i criteri a queste risorse, avviare l'aggiornamento delle risorse esistenti. Questo articolo include un esempio di PowerShell per l'attivazione di un aggiornamento.

Assicurarsi che tutte le risorse di un gruppo di risorse abbiano un tag/valore

Un requisito comune è che tutte le risorse di un gruppo di risorse abbiano un determinato tag e valore. Questo requisito è spesso necessario per tenere traccia dei costi per reparto. Le condizioni seguenti devono essere soddisfatte:

  • Il tag richiesto e il relativo valore vengono accodati alle risorse nuove e aggiornate che non hanno il tag.
  • Non è possibile rimuovere il tag richiesto e il relativo valore da eventuali risorse esistenti.

È possibile soddisfare questo requisito applicando due criteri predefiniti a un gruppo di risorse.

ID Descrizione
2a0e14a6-b0a6-4fab-991a-187a4f81c498 Applica un tag obbligatorio e il relativo valore predefinito quando non viene specificato dall'utente.
1e30110a-5ceb-460c-a204-c1c3969c6d62 Applica un tag obbligatorio e il relativo valore.

PowerShell

Lo script di PowerShell seguente assegna le due definizioni di criteri predefiniti a un gruppo di risorse. Prima di eseguire lo script, assegnare tutti i tag richiesti al gruppo di risorse. Ogni tag nel gruppo di risorse è richiesto per le risorse nel gruppo. Per eseguire l'assegnazione a tutti i gruppi di risorse nella sottoscrizione, non fornire il parametro -Name quando si recuperano i gruppi di risorse.

$appendpolicy = Get-AzureRmPolicyDefinition | Where-Object {$_.Name -eq '2a0e14a6-b0a6-4fab-991a-187a4f81c498'}
$denypolicy = Get-AzureRmPolicyDefinition | Where-Object {$_.Name -eq '1e30110a-5ceb-460c-a204-c1c3969c6d62'}

$rgs = Get-AzureRMResourceGroup -Name ExampleGroup

foreach($rg in $rgs)
{
    $tags = $rg.Tags
    foreach($key in $tags.Keys){
        $key 
        $tags[$key]
        New-AzureRmPolicyAssignment -Name ("append"+$key+"tag") -PolicyDefinition $appendpolicy -Scope $rg.ResourceId -tagName $key -tagValue  $tags[$key]
        New-AzureRmPolicyAssignment -Name ("denywithout"+$key+"tag") -PolicyDefinition $denypolicy -Scope $rg.ResourceId -tagName $key -tagValue  $tags[$key]
    }
}

Dopo aver assegnato i criteri, è possibile attivare l'aggiornamento di tutte le risorse esistenti per applicare i criteri dei tag aggiunti. Lo script seguente consente di mantenere gli altri tag presenti nelle risorse:

$group = Get-AzureRmResourceGroup -Name "ExampleGroup" 

$resources = Find-AzureRmResource -ResourceGroupName $group.ResourceGroupName 

foreach($r in $resources)
{
    try{
        $r | Set-AzureRmResource -Tags ($a=if($r.Tags -eq $NULL) { @{}} else {$r.Tags}) -Force -UsePatchSemantics
    }
    catch{
        Write-Host  $r.ResourceId + "can't be updated"
    }
}

Richiedere tag per un tipo di rosorsa

L'esempio seguente illustra come nidificare gli operatori logici per richiedere un tag dell'applicazione solo per un determinato tipo di risorsa (in questo caso gli account di archiviazione).

{
    "if": {
        "allOf": [
          {
            "not": {
              "field": "tags",
              "containsKey": "application"
            }
          },
          {
            "field": "type",
            "equals": "Microsoft.Storage/storageAccounts"
          }
        ]
    },
    "then": {
        "effect": "audit"
    }
}

Tag richiesto

Il criterio seguente nega le richieste senza un tag con la chiave "costCenter" (è possibile applicare qualsiasi valore):

{
  "if": {
    "not" : {
      "field" : "tags",
      "containsKey" : "costCenter"
    }
  },
  "then" : {
    "effect" : "deny"
  }
}

Passaggi successivi