1. 程式人生 > >我狠起來連自己都打---如何簡單實現Azure resource自動打標籤

我狠起來連自己都打---如何簡單實現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即可。

 

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