我狠起來連自己都打---如何簡單實現Azure resource自動打標簽


你是否還在為花費大量Azure Resource打標簽而煩惱呢?你是否還在因為這樣低效的重復勞動而痛苦呢?

在很長一段時間內,筆者既要做雲架構調整,又要做日常系統維護,還要參與各種各樣的項目,在這種情況下,如果我還花許多時間在打標簽這種小事上,不僅勞累了自己,還會耽誤其他更重要的任務。

作為高級懶人,我們絕對不能夠允許這樣的情況存在,一切能夠自動化的操作絕不能允許自己去手動完成。

雖然話是這么說,具體打什么樣的標簽還是要你自己決定的。但是我相信絕大多數企業至少都會打application或者project的標簽來進行分類。那基於這種情況,我介紹一種比較討巧的方法可以讓resource自己認爹,但是這種方法目前有幾個限制:

1.不會重復檢查已經打好的標簽

2.資源組的標簽還是要手動提前打好

3.所打的標簽參照資源所屬的資源組

 

在這里我們要用到Azure兩個服務,一個是azure policy另一個則是經常用到的automation,步驟其實很簡單,如下

 

1.利用Azure policy中的“Append tag and its default value”, 指定tag Name為application, tag value 為undefined

至此之后你所有建立的azure resource 都會在創建之初就帶有這個預設的tag

2.建立資源組時做好tagging

3. 利用azure automation的runbook去遍歷所有帶有預設tag的resource, 並將對應的resource group的標簽應用在其自身。

具體runbook sample 如下:

$connectionName = "AzureRunAsConnection" 
try
{

    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint `
        -EnvironmentName AzureChinaCloud
 }
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}

Select-AzureRmSubscription -Subscription SubscriptionName $Resources = (Get-azurermresource -Tag @{ Application="undefined"})

Foreach ($resource in $Resources)
{
    $Rgname = $resource.Resourcegroupname

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

    $resourcetags = $resource.Tags

            $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

}

如果你的資源比較多並且在各個訂閱都有,可以把runbook改用為workflow,並且多一個遍歷所有訂閱的嵌套。

另外還有一點,automation 的run as account必須對所有的資源至少擁有可以修改標簽的權限。

這里你可能會說,為什么我們不去遍歷所有的resource去自動apply RG的標簽呢?想想一下當你的resource數量上千上萬的時候,你這個job得run多久。因此簡單的一個預設標簽作為get-azurermresource 的filter就大大節省去了之后重復多余的標簽動作,只需要給新增的resource tagging即可。

 

筆者先提供自己的方法作為拋磚引玉,大家可以在此基礎上進行一些優化。或者如果有更好的自動標簽的方案也歡迎提出交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM