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 } } }