新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD应用的Key

前篇讲过有一个面向公众的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=Automation

所以呢,如果这一篇还是写用Runbook实现Azure 虚机自动开关机的话,估计就没人看了。正巧前段时间客户提了一个问题 ”为安全起见,在AzureAD注册应用时候会选择生成有效期为一年或者两年的key。 那能不能在key过期前2个月就自动发email提醒开发运维团队修改部署新key呢?每个应用在AD注册的时间不相同,要用人力来管理几十个应用的key的有效期不太现实”

这是一个典型的用Runbook可以帮助简化工作流程提高运维效率的案例。我们以此为例来了解什么场景可以用runbook,怎么写runbook,怎么才能用好runbook。

需求梳理

  • 做为公司Azure环境的运维团队,我需要一份自动生成的信息列表,其中包含在Azure AD注册的所有应用的key是不是在2个星期内,1个月内,2个月内即将过期的信息
  • 做为公司Azure环境的运维团队,我需要每星期都能收到email关于应用key过期最新状态的通知

需求分析

这个Task的自动化可以分为2部分:

第一部分是读取Azure AD内应用key信息,可以用Powershell AzureAD模块来获取,至于发送email 可以用powershell的SMTP 代码,在Runbook里有内嵌powershell的支持。

另外一部分是这段代码必须可以每天固定时间段重复自动执行,用户不需要额外配置一台服务器来运行这段代码。 那Runbook的Schedules通过在portal的简单配置就可以实现这个需求

实现过程

  • 在automation account里导入AzureAD模块

  • 在automation account里创建2个credential,一个是Azure AD的管理员登录所用credential,我们会用这个来获取AAD中应用的相关Key的信息。一个是发送key信息所用的email账号的credential,通常这是运维团队的team email信箱

可以看到在创建之后相关的密码都是不可见非明文的,安全上没有问题

  • 创建一个名为 aadappkeymanagement的runbook, 首先代码需要读取我们在上一步创建的两个credential。 切记,这里需要用到的powershell 命令是 Get-AutomationPSCredential而不是Get-AzureRMAutomationCredential。后一个的用法我们下篇automation account的automation中涉及。代码如下:
$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()}
$1monthresults += ("<br>" + $AADapp.DisplayName) | Where {$EndDate -lt $(get-date).AddMonths()}
$2weeksresults += ("<br>" + $AADapp.DisplayName) | Where {$EndDate -lt $(get-date).Adddays()}
}

  最后把上一步获取的信息做一些格式化增强一下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', )
$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)
  • 把上述代码填写到Runbook后,我们接着看一下怎么用Runbook

写完代码,点击Save。接下来需要测试一下我们的代码。按顺序点击Test Pane 和Start.

Automation account的测试沙盒会运行刚刚保存的Runbook。我们的脚本里有发送email这一段,测试完检查一下信息,你会收到脚本发送的email。

脚本里也可以加入debug输出信息,运行时测试窗口会显示这些信息。测试成功后,回到Runbook窗口,点击’Publish’. 我们的Runbook就正式发布了。发布之后任何对于代码的改动可以继续通过点击save-》test pane-》start进行测试而不影响已发布Runbook正常运行。有没有一丝testing和production感觉啊 ?而且还是Azure managed testing 环境哦。

  • 接下来我们开始部署Runbook的自动运行

在发布好的Runbook主界面点击‘Schedule’创建一个北京时间每周一上午10:30运行runbook的Schedule。当然,也可以设置成每小时,每天或者每月的schedule

好了,接下来每周一上班时候运维团队就能收到email的通知,了解到AAD中application key是否将过期的汇总email了。有兴趣的同学还可以接着试一下用runbook自动更新即将过期的Key。

另外,还可以在Automation account的job页面查看一下每次自动执行runbook是否成功

总结

整个automation account的runbook就是写完一段代码上传Azure配置好自动执行的Schedule,再没有必要为了运行运维脚本而单独维护一台甚至多台服务器了。而这个轻量级的无服务器化工具本身还集成了安全,源代码集成,多环境测试,生产环境rollback等多项功能。

新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD Application Key的更多相关文章

  1. 新版Azure Automation Account 浅析(一) --- 创建和Run As Account

    去年年底Azure中国的Automation Account悄悄做了升级.新版本不管从功能还是end user experience方面都让人耳目一新.如果说升级前只是一个运行脚本的小工具,升级后的A ...

  2. 新版Azure Automation Account 浅析(二) --- 更新Powershell模块和创建Runbook

    前篇我们讲了怎样创建一个自动化账户以及创建时候"Run As Account"选项背后的奥秘.这一篇针对在Azure自动化账户中使用Powershell Runbook的用户讲一下 ...

  3. Azure Automation (2) 定期删除存储账号中的文件

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 本文是对笔者之前的文档Azure Backup (1) 将SQL ...

  4. Azure Automation (1) 入门

    <Windows Azure Platform 系列文章目录> 通过Azure Automation(自动化),开发人员可以自动完成通常要在云环境中执行的手动.长时间进行.易出错且重复性高 ...

  5. Step by Step 用Azure Automation 来开虚机(ARM)

    使用Azure Automation来自动化处理各种重复的耗时的云管理任务从而帮助云运维人员提升效率,帮助降低运营成本. 具体相关的介绍以及怎样利用Azure Automation来完成定期开关虚拟机 ...

  6. Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 在笔者之前的文章中,我们介绍了使用Azure Automation ...

  7. Azure Automation (4) 按照Azure虚拟机的机器名,设置开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China服务. 在有的时候,我们不需要将所有的虚拟机进行开关机. 本文介绍的脚 ...

  8. 利用Azure Automation实现云端自动化运维(1)

    Azure Automation是Azure上的一个自动化工作流引擎,基于Powershell,来帮助用户简化,集成和自动化Azure上的运维工作,例如: 实现定时开关虚拟机,节约成本 实现定时创建删 ...

  9. Go Global 之怎样在全球Azure上使用Azure Free Account

    随着中国用户出海的越来越多,同学们自学Azure Global 功能的积极性也越来越高.怎样开启Azure Global 账号,有哪些Global Azure的功能可以免费使用,能不能用国内的信用卡和 ...

随机推荐

  1. sql server2008数据库复制实现数据同步常见问题

    sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...

  2. Winform & Devexpress Chart使用入门

    一.Chart(Winform) 使用图表控件(chart)首先要理解图表区域(ChartArea).XY轴(AxisX.AxisY).数据点(Series).标题(Title).图例(Legend) ...

  3. input事件中文触发多次问题研究

    我们在网页中经常会遇到实时搜索的情况,或者其他类似需要input实时响应的问题,一般情况下,我们是利用input和propertychange事件来监听input内容的变化来响应,但是有一个问题就是当 ...

  4. $.extend()方法和(function($){...})(jQuery)详解

    1.    JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...

  5. 使用nginx作为websocket的proxy server

    blog.csdn.net/zhx6044/article/details/50278765 WebSocket WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选 ...

  6. mybatis_SQL映射(4)鉴别器

    摘录自:http://blog.csdn.net/y172158950/article/details/17505739 鉴别器:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的 ...

  7. [bx]和loop指令

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  8. Mysql覆盖索引 covering index 或者 index coverage

    组合索引 提到组合索引,大家都知道"最左前缀"原则.例如,创建索引 idx_name_age (name,age) ,通常情况下,where age=50 或者 where age ...

  9. mysql-innoDB-多版本并发控制(MVCC)

    InnoDB的MVCC,是通过在每行记录后面保存三个隐藏的列来实现的其中的两个列一个保存了行的创建时间,一个保存行的过期时间(或删除时间).当然存储的并不是实际的时间值,而是系统版本号(system ...

  10. 基于 HTML5 的 3D 工控隧道案例

    隧道的项目我目前是第一次接触,感觉做起来的效果还蛮赞的,所以给大家分享一下.这个隧道项目的主要内容包括:照明.风机.车道指示灯.交通信号灯.情报板.消防.火灾报警.车行横洞.风向仪.COVI.微波车检 ...