zoukankan      html  css  js  c++  java
  • 新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD Application Key

    新版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(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)
    
     
    • 把上述代码填写到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等多项功能。

  • 相关阅读:
    yarn 0.9.0 build spark
    redhat6.4上build storm 0.9.0.1
    redhat6.4安装storm集群-4节点
    Hadoop 2.2.0 4结点集群安装 非HA
    redhat6.4上安装mysql
    redhat6.4上用apache建立os repos
    Hive Over HBase
    Hadoop 2.2.0学习笔记20131210
    Hadoop 2.2.0学习笔记20131209
    IDH2.5.1. Pain Points
  • 原文地址:https://www.cnblogs.com/meowmeow/p/8453567.html
Copyright © 2011-2022 走看看