在上述基本準備工做作完後,wo們看看如何實現利用Azure Automation實現定時自動開關機的操做,這種場景很是適合Dev/Test環境,由於Azure的虛擬機是按照分鐘收費的,因此咱們能夠在開發測試人員上班的時候打開虛擬機,而在下班,週末的時候關閉虛擬機,從而節約成本,從另一個層面來說,也是體現雲的靈活性。git
首先講一下設計的基本原則,如何作能讓你的自動化腳本更靈活,更具備可移植性:github
參數化:儘可能不要在腳本中寫死任何變量,負責除了修改代碼,別無他法,並且可維護性會變的不好運維
合理使用資產:在Azure的automation中,有一部分配置是須要更新,變化的,因此這一部分配置應該放在資產中,讓運維人員來修改,好比有哪些虛擬機須要開機,關機ide
模塊化:通用的一些腳本能夠寫成runbook,以便於代碼複用和共享模塊化
1. 登入portal,選擇新建runbook,選擇從庫中建立,你能夠看到其實已經內置了不少的腳本,咱們選擇Featured裏面的Stop Azure Classic VMs,單機下一步,你能夠看到腳本的定義:測試
2. 輸入你但願的runbook名稱,選擇咱們以前創建的自動化帳戶,地區,選擇完成將runbook添加到你的自動化帳戶:spa
3. 打開自動化帳戶,在runbook的tab下你就能夠剛纔建立的runbook Stop-AzureVMLib,點擊這個runbook,選擇創做,就能夠看到這個腳本的所有源碼,並能夠修改,在底部設計
4. Runbook的基本結構以下,以workflow開頭,後面是你的runbook名字,param是你的輸入參數,outputtype裏面定義了string類型的返回結果:日誌
workflow Stop-AzureVMLiborm
{
param (
[Parameter(Mandatory=$false)]
[String] $ServiceName
)
# Returns strings with status messages
[OutputType([String])]
Body
}
5. 如今咱們設計一個Stop-VM的能夠在實際環境中使用的runbook,實現如下幾個目標:
用戶能夠配置哪些vm須要被定時中止,而不須要修改代碼
認證信息能夠被修改而不須要修改代碼
週六週日不須要定時關機或者開機
詳細的執行日誌信息
6 . 使用Azure的用戶名密碼進行認證,相關的orgid,密碼咱們都保存在資產中,經過動態得到,而不須要修改代碼,經過Get-AutomationVariable獲得的數據均可以在添加資產中添加變量得到:
#資產中定義的用戶名和訂閱名
$AzureCredentialAssetName = 'automationuser@XXXX.cn'
$AzureSubscriptionIdAssetName = 'automationsubid'
# 獲得資產中定義的用戶名密碼和訂閱名稱
$Cred = Get-AutomationPSCredential -Name $AzureCredentialAssetName
$SubId = Get-AutomationVariable -Name $AzureSubscriptionIdAssetName
#得到須要關閉的虛擬機列表,以逗號分隔
$vmconfiglist = Get-AutomationVariable -Name 'vmnamelist'
$vmlist = $vmconfiglist -split ","
#得到認證,添加訂閱進行後續操做
$null = Add-AzureAccount -Credential $Cred -Environment AzureChinaCloud -ErrorAction Stop
$null = Select-AzureSubscription -SubscriptionId $SubId -ErrorAction Stop
7. 那麼若是使用證書的方式,如何得到認證暱?
$AzureSubscriptionIdAssetName = 'automationsubid'
$subscriptionNameAssetname = 'azuresubscriptionname'
#得到訂閱ID和訂閱名稱
$SubId = Get-AutomationVariable -Name $AzureSubscriptionIdAssetName
$subscriptionName = Get-AutomationVariable -Name $subscriptionNameAssetname
#得到認證名稱和證書
$certificateName = Get-AutomationVariable -Name "mycertificateName"
$certificate = Get-AutomationCertificate -Name $certificateName
#根據證書這是當前訂閱
Set-AzureSubscription -SubscriptionName $subscriptionName -SubscriptionId $SubId -Certificate $certificate -Environment AzureChinaCloud -ErrorAction Stop
Select-AzureSubscription -SubscriptionId $SubId -ErrorAction Stop
8. 剩下的就是根據虛擬機機器名稱獲得虛擬機進行中止虛擬機的操做了,全部的源代碼我都放在了Github,請分別下載測試:
經過用戶名密碼驗證方式中止虛擬機:
https://github.com/kingliantop/azurelabs/blob/master/automation/stop-azurevms.ps1
經過用戶名密碼驗證方式啓動虛擬機:
https://github.com/kingliantop/azurelabs/blob/master/automation/start-azurevms.ps1
經過證書方式中止虛擬機:
https://github.com/kingliantop/azurelabs/blob/master/automation/stop-azurevmswithcert.ps1
經過證書方式啓動虛擬機:
https://github.com/kingliantop/azurelabs/blob/master/automation/start-azurevmswithcert.ps1
9. runbook編輯完成,點擊發布正式發佈該runbook,但這個時候這些腳本不會自動運行,須要你設置定時運行方式,選擇runbook中的計劃日程,定義了何時運行這些腳本, 選擇連接到新計劃:
10. 輸入計劃的名稱,設置天天定時關機的計劃,你能夠看到目前的設置選項中到小時級,或者天天,但沒有工做日或者週末定義,須要本身寫代碼實現,具體實現請參考代碼。
11. 每一個runbook都須要設置加護日程,經過這種方式,你就能夠實現早上開機,晚上關機,週末不開關機等操做。