新版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等多项功能。