Azure 基礎 : 使用 Automation 定時開機

zybing發表於2021-09-09

不知何時 Azure 為虛機提供了自動關機的功能。這是一個很棒的功能,可以幫助我們定時關閉虛機並釋放掉資源以節省開支。如果某臺虛機在夜間不需要提供服務,我們就可以把它配置為晚上的某個時間點自動關機:

圖片描述

接下來讓人鬱悶的事情來了!在配置自動關機的時候我們沒有發現定時開機的相關配置!不僅如此,筆者在新建虛機的時候發現預設的設定中居然開啟了定時關機的功能:

圖片描述

到此為止筆者好像有些明白了,這一定又是套路!肯定是為了推廣某個服務而採取的不友好表現。
沒辦法,接下來只能靠自己了。最直接的方法就是寫一個 PowerShell 指令碼,在指令碼中登入 Azure,然後執行開機的命令。如果要每天定時開機,可以建立一個計劃任務定時執行 PowerShell 指令碼就可以了。
具體的實現請參考《Azure 基礎:用 PowerShell 自動登入》一文(只要把 demo 中重啟虛機的命令改為啟動命令就可以了)。但是這種方式有一個缺點:我們儲存在檔案中的登入資訊會過期。也就是說每隔一段時間都需要重新登入一遍並匯出新的登入資訊到檔案中。

既然不掏錢的方法有缺點,就讓我們看看 MS 推薦的解決方案(要收費的)。
MS 在雲端提供了的服務:Automation。所以我們可以透過 Automation 中提供的服務來實現定時開機的功能。

建立 Automation Account

要使用 Automation 進行自動化的工作,需要先新建一個 Automation 型別的服務,其實就是建立一個 Automation Account:

圖片描述

Automation Account 會管理很多的資源,其中最重要的是一些執行各種自動化任務的 runbook:

圖片描述

Azure 提供了多種型別的 runbook,使用者可以選擇自己喜歡的方式。這裡我們新建一個 PowerShell 型別的 runbook:

圖片描述

編輯重啟虛機的指令碼

建立了 PowerShell 型別的 runbook 後就可以編輯真正幹活的指令碼了,在 runbook 的編輯器中輸入下面的程式碼:

圖片描述

$connectionName = "AzureRunAsConnection"$rusultMessage = "The virtual machine started successfully."try{    # Get the connection "AzureRunAsConnection"    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName     Add-AzureRmAccount `    -ServicePrincipal `    -TenantId $servicePrincipalConnection.TenantId `    -ApplicationId $servicePrincipalConnection.ApplicationId `    -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint     Start-AzureRmVM -Name 'vm name' -ResourceGroupName 'resource group name'}catch {    $rusultMessage = "The virtual machine failed to start."    if (!$servicePrincipalConnection)    {        $ErrorMessage = "Connection $connectionName not found."        throw $ErrorMessage    } else{        Write-Error -Message $_.Exception        throw $_.Exception    }}finally {    $Username ="sendgrid user name"    $Password = ConvertTo-SecureString "your password" -AsPlainText -Force    $credential = New-Object System.Management.Automation.PSCredential $Username, $Password    $SMTPServer = "smtp.sendgrid.net"    $EmailFrom = "No-reply@cmteam.com"    [string[]]$EmailTo = "Nick "    $Subject = "start vm"    $Body = $rusultMessage    Send-MailMessage -smtpServer $SMTPServer `
                     -Credential $credential `
                     -Usessl `
                     -Port 587 `
                     -from $EmailFrom `
                     -to $EmailTo `
                     -subject $Subject `
                     -Body $Body `
                     -BodyAsHtml    Write-Output "Email sent succesfully."}

圖片描述

首先,最好是透過異常處理結構處理指令碼執行中的異常。這裡只是簡單的把異常重新丟擲,最後它們會被顯示到執行的日誌中。

接下來的一個很重要的概念是 AutomationConnection。我們可以認為它包含了一些資訊可以用來連線需要操作的目標資源並提供相應的認證資訊。指令碼中使用的 AutomationConnection 名字為 AzureRunAsConnection,它是隨著 Automation Account 一起建立的。如果 AzureRunAsConnection 不能滿足需求,我們可以建立自定義的 AutomationConnection。

然後透過 Add-AzureRmAccount 命令使用 AzureRunAsConnection 提供的資訊進行登入從而獲得操作資源的許可權。

最後由 Start-AzureRmVM 命令執行啟動虛機的操作。

傳送郵件

為了 demo 的完整性,筆者透過 finally 結構強制在指令碼結束前給管理員傳送通知郵件。郵件透過 sendgrid 的伺服器進行傳送,報告啟動虛機的過程是否成功:

圖片描述

$Username ="azure_sendgrid user name@azure.com"$Password = ConvertTo-SecureString "your password" -AsPlainText -Force$credential = New-Object System.Management.Automation.PSCredential $Username, $Password$SMTPServer = "smtp.sendgrid.net"$EmailFrom = "No-reply@cmteam.com"[string[]]$EmailTo = "Nick "$Subject = "start vm"$Body = $rusultMessageSend-MailMessage -smtpServer $SMTPServer `
                 -Credential $credential `
                 -Usessl `
                 -Port 587 `
                 -from $EmailFrom `
                 -to $EmailTo `
                 -subject $Subject `
                 -Body $Body `
                 -BodyAsHtmlWrite-Output "Email sent succesfully."

圖片描述

測試指令碼的執行情況

在完成指令碼的編輯後點選 "Test pane" 進入指令碼測試介面,然後點選 "Start" 開始測試:

圖片描述

這個過程會執行你的指令碼,並輸出執行的日誌資訊。透過這種方式我們可以檢查指令碼的執行情況並對指令碼進行調整。

配置計劃任務

完成指令碼的測試後,在編輯介面點選 "Publish" 結束指令碼的編輯。然後為 runbook 新增一個計劃任務:

圖片描述

上面的配置會在每天早上 6 點鐘觸發指令碼的執行,也就是啟動我們指定的虛擬機器。

總結

這就 OK 了!是的,看起來還是比較繁瑣的。由於內部是透過 Azure 的認證機制完成許可權認證的,所以它能夠完美的解決我們在其它方案中碰到的登入認證問題。
另外,既然 Automation 服務是專門在雲端提供自動化功能的,那它自然應該具有很多拿的出手的能力,筆者後續會對 Azure Automation 做專門的介紹。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-2800966/,如需轉載,請註明出處,否則將追究法律責任。

相關文章