不知何時 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 <nick@xxxx.com>" $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 <nick@xxxx.com>" $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."
測試腳本的執行情況
在完成腳本的編輯后點擊 "Test pane" 進入腳本測試界面,然后點擊 "Start" 開始測試:
這個過程會執行你的腳本,並輸出執行的日志信息。通過這種方式我們可以檢查腳本的執行情況並對腳本進行調整。
配置計划任務
完成腳本的測試后,在編輯界面點擊 "Publish" 結束腳本的編輯。然后為 runbook 添加一個計划任務:
上面的配置會在每天早上 6 點鍾觸發腳本的執行,也就是啟動我們指定的虛擬機。
總結
這就 OK 了!是的,看起來還是比較繁瑣的。由於內部是通過 Azure 的認證機制完成權限認證的,所以它能夠完美的解決我們在其它方案中碰到的登錄認證問題。
另外,既然 Automation 服務是專門在雲端提供自動化功能的,那它自然應該具有很多拿的出手的能力,筆者后續會對 Azure Automation 做專門的介紹。