Скрипт для применения тегов из группы ресурсов к ресурсам - PullRequest
0 голосов
/ 21 декабря 2018

Попытка применить теги, которые установлены на уровне ГРУППЫ ресурсов, к любым ресурсам в группе ресурсов (все ресурсы).

Нашел скрипт в сети и изменил его минимально.

Долженубедитесь, что тег NAME и тег VALUE установлены на основе группы ресурсов (например: если группа ресурсов имеет имя тега «ABCD» и значение тега «1234», а ресурс под группой ресурсов имеет тег «ABCD» и тегзначение "4567", тогда оно должно перезаписать это значение на "1234") Существует один тег, который должен быть установлен на всех ресурсах.Имя, которое мы знаем, но значение, которого мы не знаем.

Я заметил, что для запуска требуется ДЛИННОЕ время.Группе ресурсов с 10 ресурсами в ней может потребоваться 1-2 минуты для запуска сценария с

Любые идеи или предложения?

#List all Resources within the Subscription
$Resources = Get-AzureRmResource

#For each Resource apply the Tag of the Resource Group
Foreach ($resource in $Resources)
{
$Rgname = $resource.Resourcegroupname

$resourceid = $resource.resourceId
$RGTags = (Get-AzureRmResourceGroup -Name $Rgname).Tags

$resourcetags = $resource.Tags

If ($resourcetags -eq $null)
    {
        Write-Output "---------------------------------------------"
        Write-Output "Applying the following Tags to $($resourceid)" $RGTags
        Write-Output "---------------------------------------------"
        $Settag = Set-AzureRmResource -ResourceId $resourceid -Tag $RGTagS -Force

    }
Else
    {
        $RGTagFinal = @{}
        $RGTagFinal = $RGTags                  
                Foreach ($resourcetag in $resourcetags.GetEnumerator())
                {

                If ($RGTags.Keys -inotcontains $resourcetag.Key)
                    {                        
                            Write-Output "------------------------------------------------"
                            Write-Output "Keydoesn't exist in RG Tags adding to Hash Table" $resourcetag
                            Write-Output "------------------------------------------------"
                            $RGTagFinal.Add($resourcetag.Key,$resourcetag.Value)
                    }    

                }
        Write-Output "---------------------------------------------"
        Write-Output "Applying the following Tags to $($resourceid)" $RGTagFinal
        Write-Output "---------------------------------------------"
        $Settag = Set-AzureRmResource -ResourceId $resourceid -Tag $RGTagFinal -Force
    }   
}

Несколько вещей, которые сценарий должен сделать тоже, которыея не уверен, что этот скрипт выполняет.

  1. Если ресурс уже имеет 15 тегов, он не будет перезаписывать тег с тегом уровня группы ресурсов;он просто пропустит это
  2. Вместо того, чтобы копировать ВСЕ теги из группы ресурсов в ресурс, есть только один тег.Можем ли мы поместить логику туда, где, если группа ресурсов имеет, например, тег «ABCDEFG», она скопирует его?Любые другие теги, которые это не будет?
  3. Возможно, чтобы ускорить это, возможно просто ПРОВЕРИТЬ, если имя и значение тега на уровне ресурса совпадает с тегом на уровне группы ресурсов, и не перезаписать егоесли это уже совпадает.Я подозреваю, что для записи требуется время, а просто чтение тегов - это не так.

1 Ответ

0 голосов
/ 21 декабря 2018

Это должно приблизить вас к тому, что вы ищете

$tagName = "ABCD"
$tagFallbackValue = "123"

$subscriptionId = "ewn3k4l4jh32jæ42æ3lj4æl12j4"

Connect-AzureRmAccount

$sub = Get-AzureRmSubscription -SubscriptionId $subscriptionId

Set-AzureRmContext -SubscriptionObject $sub

$resGroups = Get-AzureRmResourceGroup

foreach ($resGroup in $resGroups) {
    #Some ResourceGroups might not have tags defined at all.
    if($null -eq $resGroup.Tags) {
        $Tag = @{}
        $null = $Tag.Add($tagName, $tagFallbackValue)

        Set-AzureRmResourceGroup -Tag $Tag -Id $resGroup.ResourceId
    }#Some ResourceGroups might have tags but missing ours.
    elseif ($resGroup.Tags.ContainsKey($tagName) -eq $false) {
        $Tag = $resGroup.Tags
        $null = $Tag.Add($tagName, $tagFallbackValue)

        Set-AzureRmResourceGroup -Tag $Tag -Id $resGroup.ResourceId
    }#We need to test those that have our tag, if they have the desired tag value
    else {
        if($resGroup.Tags.$tagName -ne $tagFallbackValue) {
            $Tag = $resGroup.Tags
            $Tag.$tagName = $tagFallbackValue

            Set-AzureRmResourceGroup -Tag $Tag -Id $resGroup.ResourceId
        }
    }

    $tagValue = $resGroup.Tags.$tagName
    $resGroupName = $resGroup.ResourceGroupName

    #Some resources might already have our tag, find them and test if they have the correct value
    $resHasTag = Get-AzureRmResource -ResourceGroupName $resGroupName | Where-Object {$null -ne $_.tags -and $_.Tags.ContainsKey($tagName) -eq $true}
    foreach ($res in $resHasTag) {
        if($res.Tags.$tagName -ne $tagValue) {
            $Tag = $res.Tags
            $Tag.$tagName = $tagValue

            Set-AzureRmResource -ResourceId $res.ResourceId -Tag $Tag -Force
        }
    }

    #Some resources might not have tags defined at all.
    $resNoTags = Get-AzureRmResource -ResourceGroupName $resGroupName | Where-Object {$null -eq $_.tags -or $_.tags.Count -lt 1}
    foreach ($res in $resNoTags) {
        $Tag = @{}
        $null = $Tag.Add($tagName, $tagValue)
        Set-AzureRmResource -ResourceId $res.ResourceId -Tag $Tag -Force
    }

    #We need to find all resources that is missing our tag and have less than 15 tags
    $resOtherTags = Get-AzureRmResource -ResourceGroupName $resGroupName | Where-Object {$null -ne $_.tags -and $_.tags.Count -lt 15 -and $_.Tags.ContainsKey($tagName) -eq $false}
    foreach ($res in $resOtherTags) {
        $Tag = $res.Tags
        $null = $Tag.Add($tagName, $tagValue)

        Set-AzureRmResource -ResourceId $res.ResourceId -Tag $Tag -Force
    }
}

Обновленная версия, соответствующая новым требованиям

$tagName = "COSTCODE"

Connect-AzureRmAccount

$subscriptions = Get-AzureRmSubscription

foreach ($sub in $subscriptions) {
    Set-AzureRmContext -SubscriptionObject $sub

    $resGroups = Get-AzureRmResourceGroup

    foreach ($resGroup in $resGroups) {
        #Some ResourceGroups might not have tags defined at all, we skip those.
        if ($null -eq $resGroup.Tags) { continue }

        #Some ResourceGroups might have tags but missing ours, we skip those.
        elseif ($resGroup.Tags.ContainsKey($tagName) -eq $false) { continue }
        #We need to test those that have our tag, if they have the desired tag value

        $tagValue = $resGroup.Tags.$tagName
        $resGroupName = $resGroup.ResourceGroupName

        #Some resources might already have our tag, find them and test if they have the correct value
        $resHasTag = Get-AzureRmResource -ResourceGroupName $resGroupName | Where-Object {$null -ne $_.tags -and $_.Tags.ContainsKey($tagName) -eq $true}
        foreach ($res in $resHasTag) {
            if ($res.Tags.$tagName -ne $tagValue) {
                $Tag = $res.Tags
                $Tag.$tagName = $tagValue

                Set-AzureRmResource -ResourceId $res.ResourceId -Tag $Tag -Force
            }
        }

        #Some resources might not have tags defined at all.
        $resNoTags = Get-AzureRmResource -ResourceGroupName $resGroupName | Where-Object {$null -eq $_.tags -or $_.tags.Count -lt 1}
        foreach ($res in $resNoTags) {
            $Tag = @{}
            $null = $Tag.Add($tagName, $tagValue)
            Set-AzureRmResource -ResourceId $res.ResourceId -Tag $Tag -Force
        }

        #We need to find all resources that is missing our tag and have less than 15 tags
        $resOtherTags = Get-AzureRmResource -ResourceGroupName $resGroupName | Where-Object {$null -ne $_.tags -and $_.tags.Count -lt 15 -and $_.Tags.ContainsKey($tagName) -eq $false}
        foreach ($res in $resOtherTags) {
            $Tag = $res.Tags
            $null = $Tag.Add($tagName, $tagValue)

            Set-AzureRmResource -ResourceId $res.ResourceId -Tag $Tag -Force
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...