TAGs – mała rzecz w Azure a cieszy, pomaga i jest obowiązkowa jeśli bawisz się na poważnie.

Dziś będzie super krótko:). Wreszcie 🙂

Każdy wie, że TAG’i w Azure się przydają by oznaczyć swoje grupy zasobów czy zasoby dodatkowymi informacjami (o samej koncepcji pisałem na drugim blogu). Można je też pięknie wykorzystać w raportach w PowerBI do weryfikowania kosztów zasobów.

TAG’s mają jednak pewną wadę albo cechę – jak kto woli 🙂 Otóż, zapisane na poziomie Grupy Zasobów wcale nie propagują się na zasoby w tej grupie zasobów. Zapisane na poziomie zasobu, zostają na poziomie zasobu 🙂

Co można z tym zrobić? PowerShell i Azure Automation okazują się być nieodzowne. Poniżej krótki skrypt, który wyrównuje na poziomie każdego zasobu Tagi tak, by odpowiadały tym na poziomie grupy. Nie zawsze się da, nie na każdy zasób można nałożyć taki stąd sekcja wyjątków.

Rozwiązanie wysoce nieidealne, ale powiązany z Azure Policy już potężne.

$rgs = Get-AzureRmResourceGroup
foreach ($rg in $rgs){
  if ($rg.Tags.Count -ne 0){
    $rgName = $rg.ResourceGroupName
    $msg="ResourceGroupName: $rgName"
    Write-Output $msg
    $resource=Find-AzureRmResource -ResourceGroupNameContains $rg.ResourceGroupName
    foreach ($rs in $resource){
          $rsName = $rs.Name
          $msg="Writing ResourceTags for resource: $rsName "
          Write-Output $msg
          $tagsCount = $rs.Tags.Count
          $msg = "#Tags before: $tagsCount"
          Write-Output $msg
          Try{
            $resourcetags = (Get-AzureRmResource -ResourceId $rs.ResourceId).Tags
            foreach ($key in $rg.Tags.Keys){
                if (($resourcetags) -AND ($resourcetags.ContainsKey($key))) { $resourcetags.Remove($key) }
            } 
            $resourcetags += $rg.Tags; 
            $output=Set-AzureRmResource -ResourceId $rs.ResourceId -Tag $resourcetags -Force 
          }
          Catch{
            $ErrorMessage = $_.Exception.Message
            $FailedItem = $_.Exception.ItemName
            $rsName = $rs.Name
            Write-Output $ErrorMessage
            Write-Output $FailedItem 
            $msg = "There was a problem writing Tags to resource: $rsName"
            Write-Output $msg
          }
          $tagsCount = $output.Tags.Count
          $msg = "#Tags after: $tagsCount"
          Write-Output $msg
    }
  }
}
Ten wpis został opublikowany w kategorii PowerShell. Dodaj zakładkę do bezpośredniego odnośnika.