新版Azure Automation Account 淺析(三) --- 用Runbook管理AAD應用的Keyhtml
前篇講過有一個面向公衆的Runbook庫,社區和微軟一直往其中加入新的Runbook,用戶能夠下載也能夠在直接在Azure Portal中導入。這樣你們均可以參考全世界範圍內工程師怎樣利用Runbook來解決工做中的難題,提升生產效率。https://gallery.technet.microsoft.com/scriptcenter/site/search?f[0].Type=RootCategory&f[0].Value=WindowsAzure&f[1].Type=SubCategory&f[1].Value=WindowsAzure_automation&f[1].Text=Automationshell
因此呢,若是這一篇仍是寫用Runbook實現Azure 虛機自動開關機的話,估計就沒人看了。正巧前段時間客戶提了一個問題 」爲安全起見,在AzureAD註冊應用時候會選擇生成有效期爲一年或者兩年的key。 那能不能在key過時前2個月就自動發email提醒開發運維團隊修改部署新key呢?每一個應用在AD註冊的時間不相同,要用人力來管理幾十個應用的key的有效期不太現實」數組
這是一個典型的用Runbook能夠幫助簡化工做流程提升運維效率的案例。咱們以此爲例來了解什麼場景能夠用runbook,怎麼寫runbook,怎麼才能用好runbook。安全
需求梳理服務器
需求分析app
這個Task的自動化能夠分爲2部分:運維
第一部分是讀取Azure AD內應用key信息,能夠用Powershell AzureAD模塊來獲取,至於發送email 能夠用powershell的SMTP 代碼,在Runbook裏有內嵌powershell的支持。工具
另一部分是這段代碼必須能夠天天固定時間段重複自動執行,用戶不須要額外配置一臺服務器來運行這段代碼。 那Runbook的Schedules經過在portal的簡單配置就能夠實現這個需求測試
實現過程ui
能夠看到在建立以後相關的密碼都是不可見非明文的,安全上沒有問題
$aadadmincredential = "aadadmin" $opsteamemailcredential = "opsteamemail" try { $aadadmin=Get-AutomationPSCredential -Name $aadadmincredential $opsteamemail=Get-AutomationPSCredential -Name $opsteamemailcredential } catch { if (!$aadadmin -or $opsteamemail) { $ErrorMessage = "Credential is not found." throw $ErrorMessage } else{ Write-Error -Message $_.Exception throw $_.Exception } }
接着,咱們鏈接Azure AD讀取key的信息而且把在2個星期/1個月/2個月內即將過時的應用記錄下來,存入各自的數組
Connect-AzureAD -Credential $aadadmin -AzureEnvironmentName AzureChinaCloud $2monthsresults = @() $1monthresults = @() $2weeksresults = @() foreach($AADapp in Get-AzureADApplication){ $EndDate = (Get-AzureADApplicationPasswordCredential -objectid $AADapp.objectid).Enddate $2monthsresults += ("<br>" + $AADapp.DisplayName) | Where {$EndDate -lt $(get-date).AddMonths(2)} $1monthresults += ("<br>" + $AADapp.DisplayName) | Where {$EndDate -lt $(get-date).AddMonths(1)} $2weeksresults += ("<br>" + $AADapp.DisplayName) | Where {$EndDate -lt $(get-date).Adddays(14)} }
最後把上一步獲取的信息作一些格式化加強一下email的可讀性,接着用smtpclient發送email。這裏用的是O365的信箱作email發送,SMTP server是'smtp.office365.com', 端口是587
$EmailBody = @() # Format the email body $EmailBody += "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>" $EmailBody += "<BODY bgcolor=""#FFFFFF"" style=""font-size: Small; font-family: TAHOMA; color: #000000""><P>" $EmailBody += "IT OPS Team " $EmailBody += "<br>" $EmailBody += "<br>" $EmailBody += "<font face='arial' color='red'>The following applications' key will expire in two weeks.</font> " $EmailBody += "" $EmailBody += "" $EmailBody += "$2weeksresults " $EmailBody += "<br>" $EmailBody += "<br>" $EmailBody += "<font face='arial' color='red'>The following applications' key will expire in one month.</font>" $EmailBody += "<br>" $EmailBody += "<br>" $EmailBody += "" $EmailBody += "" $EmailBody += "$1monthsresults" $EmailBody += "<br>" $EmailBody += "<br>" $EmailBody += "<font face='arial' color='red'>The following applications' key will expire in two months.</font> " $EmailBody += "" $EmailBody += "" $EmailBody += "$2monthsresults" $EmailBody += "" $EmailBody += "" $SMTPClient = New-Object Net.Mail.SmtpClient('smtp.office365.com', 587) $SMTPClient.EnableSsl = $true $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($opsteamemail.username , $opsteamemail.password); $mail = New-Object Net.Mail.MailMessage($opsteamemail.username, $opsteamemail.username, "Alert: some AAD application key will expire soon", $EmailBody) $mail.isBodyHtml = $true $SMTPClient.Send($mail)
寫完代碼,點擊Save。接下來須要測試一下咱們的代碼。按順序點擊Test Pane 和Start.
Automation account的測試沙盒會運行剛剛保存的Runbook。咱們的腳本里有發送email這一段,測試完檢查一下信息,你會收到腳本發送的email。
腳本里也能夠加入debug輸出信息,運行時測試窗口會顯示這些信息。測試成功後,回到Runbook窗口,點擊’Publish’. 咱們的Runbook就正式發佈了。發佈以後任何對於代碼的改動能夠繼續經過點擊save-》test pane-》start進行測試而不影響已發佈Runbook正常運行。有沒有一絲testing和production感受啊 ?並且仍是Azure managed testing 環境哦。
在發佈好的Runbook主界面點擊‘Schedule’建立一個北京時間每週一上午10:30運行runbook的Schedule。固然,也能夠設置成每小時,天天或者每個月的schedule
好了,接下來每週一上班時候運維團隊就能收到email的通知,瞭解到AAD中application key是否將過時的彙總email了。有興趣的同窗還能夠接着試一下用runbook自動更新即將過時的Key。
另外,還能夠在Automation account的job頁面查看一下每次自動執行runbook是否成功
總結
整個automation account的runbook就是寫完一段代碼上傳Azure配置好自動執行的Schedule,再沒有必要爲了運行運維腳本而單獨維護一臺甚至多臺服務器了。而這個輕量級的無服務器化工具自己還集成了安全,源代碼集成,多環境測試,生產環境rollback等多項功能。