不知何时 Azure 为虚机提供了自动关机的功能。这是一个很棒的功能,可以帮助我们定时关闭虚机并释放掉资源以节省开支。如果某台虚机在夜间不需要提供服务,我们就可以把它配置为晚上的某个时间点自动关机:

接下来让人郁闷的事情来了!在配置自动关机的时候我们没有发现定时开机的相关配置!不仅如此,笔者在新建虚机的时候发现默认的设置中居然打开了定时关机的功能:

到此为止笔者好像有些明白了,这一定又是套路!肯定是为了推广某个服务而采取的不友好表现。
没办法,接下来只能靠自己了。最直接的方法就是写一个 PowerShell 脚本,在脚本中登录 Azure,然后执行开机的命令。如果要每天定时开机,可以创建一个计划任务定时执行 PowerShell 脚本就可以了。
具体的实现请参考《Azure 基础:用 PowerShell 自动登录》一文(只要把 demo 中重启虚机的命令改为启动命令就可以了)。但是这种方式有一个缺点:我们保存在文件中的登录信息会过期。也就是说每隔一段时间都需要重新登录一遍并导出新的登录信息到文件中。

既然不掏钱的方法有缺点,就让我们看看 MS 推荐的解决方案(要收费的)。
MS 在云端提供了自动化运维的服务:Automation。所以我们可以通过 Automation 中提供的服务来实现定时开机的功能。

创建 Automation Account

要使用 Automation 进行自动化的工作,需要先新建一个 Automation 类型的服务,其实就是创建一个 Automation Account:

Automation Account 会管理很多的资源,其中最重要的是一些执行各种自动化任务的 runbook:

Azure 提供了多种类型的 runbook,用户可以选择自己喜欢的方式。这里我们新建一个 PowerShell 类型的 runbook:

编辑重启虚机的脚本

创建了 PowerShell 类型的 runbook 后就可以编辑真正干活的脚本了,在 runbook 的编辑器中输入下面的代码:

$connectionName = "AzureRunAsConnection"
$rusultMessage = "The virtual machine started successfully."
try
{
# Get the connection "AzureRunAsConnection"
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
Start-AzureRmVM -Name 'vm name' -ResourceGroupName 'resource group name'
}
catch {
$rusultMessage = "The virtual machine failed to start."
if (!$servicePrincipalConnection)
{
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
} else{
Write-Error -Message $_.Exception
throw $_.Exception
}
}
finally {
$Username ="sendgrid user name"
$Password = ConvertTo-SecureString "your password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $Username, $Password
$SMTPServer = "smtp.sendgrid.net"
$EmailFrom = "No-reply@cmteam.com"
[string[]]$EmailTo = "Nick <nick@xxxx.com>"
$Subject = "start vm"
$Body = $rusultMessage
Send-MailMessage -smtpServer $SMTPServer `
-Credential $credential `
-Usessl `
-Port 587 `
-from $EmailFrom `
-to $EmailTo `
-subject $Subject `
-Body $Body `
-BodyAsHtml
Write-Output "Email sent succesfully."
}

首先,最好是通过异常处理结构处理脚本执行中的异常。这里只是简单的把异常重新抛出,最后它们会被显示到执行的日志中。

接下来的一个很重要的概念是 AutomationConnection。我们可以认为它包含了一些信息可以用来连接需要操作的目标资源并提供相应的认证信息。脚本中使用的 AutomationConnection 名字为 AzureRunAsConnection,它是随着 Automation Account 一起创建的。如果 AzureRunAsConnection 不能满足需求,我们可以创建自定义的 AutomationConnection。

然后通过 Add-AzureRmAccount 命令使用 AzureRunAsConnection 提供的信息进行登录从而获得操作资源的权限。

最后由 Start-AzureRmVM 命令执行启动虚机的操作。

发送邮件

为了 demo 的完整性,笔者通过 finally 结构强制在脚本结束前给管理员发送通知邮件。邮件通过 sendgrid 的服务器进行发送,报告启动虚机的过程是否成功:

$Username ="azure_sendgrid user name@azure.com"
$Password = ConvertTo-SecureString "your password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $Username, $Password
$SMTPServer = "smtp.sendgrid.net"
$EmailFrom = "No-reply@cmteam.com"
[string[]]$EmailTo = "Nick <nick@xxxx.com>"
$Subject = "start vm"
$Body = $rusultMessage
Send-MailMessage -smtpServer $SMTPServer `
-Credential $credential `
-Usessl `
-Port 587 `
-from $EmailFrom `
-to $EmailTo `
-subject $Subject `
-Body $Body `
-BodyAsHtml
Write-Output "Email sent succesfully."

测试脚本的执行情况

在完成脚本的编辑后点击 "Test pane" 进入脚本测试界面,然后点击 "Start" 开始测试:

这个过程会执行你的脚本,并输出执行的日志信息。通过这种方式我们可以检查脚本的执行情况并对脚本进行调整。

配置计划任务

完成脚本的测试后,在编辑界面点击 "Publish" 结束脚本的编辑。然后为 runbook 添加一个计划任务:

上面的配置会在每天早上 6 点钟触发脚本的执行,也就是启动我们指定的虚拟机。

总结

这就 OK 了!是的,看起来还是比较繁琐的。由于内部是通过 Azure 的认证机制完成权限认证的,所以它能够完美的解决我们在其它方案中碰到的登录认证问题。
另外,既然 Automation 服务是专门在云端提供自动化功能的,那它自然应该具有很多拿的出手的能力,笔者后续会对 Azure Automation 做专门的介绍。

Azure 基础 : 使用 Automation 定时开机的更多相关文章

  1. 免费电子书:微软Azure基础之Azure Automation

    (此文章同时发表在本人微信公众号"dotNET每日精华文章") Azure Automation是Azure内置的一项自动化运维基础功能,微软为了让大家更快上手使用这项功能,特意推 ...

  2. Azure 基础:使用 powershell 创建虚拟机

    在进行与 azure 相关的自动化过程中,创建虚拟主机是避不开的操作.由于系统本身的复杂性,很难用一两条简单的命令完成虚拟主机的创建.所以专门写一篇文章来记录使用 PowerShell 在 azure ...

  3. Azure 基础 : 使用 template 简化部署

    笔者在前文中介绍了如何使用 PowerShell 脚本在 Azure 上创建虚拟主机.正如你所看到的,整个创建过程还是有点繁琐的,因为我们需要使用 PowerShell 脚本创建并关联所有相关的组件. ...

  4. Azure 基础:使用 powershell 创建虚拟网络

    什么是虚拟网络 虚拟网络是您的网络在 Azure 云上的表示形式.您可以完全控制虚拟网络的 IP 地址.DNS 的设置.安全策略和路由表.您还可以更进一步,把虚拟网络划分为多个子网.然后用它们连接您的 ...

  5. Azure 基础:Blob Storage

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在前文中介绍了 Table Storage 的基本 ...

  6. 技嘉 gigabyte b75m d3v 主板 定时开机无效问题解决

    BIOS 里面设置定时开机后发现到点并没有正常启动~~~  百思不得解.后来发现原来是WIN8系统下的控制面板的关机并非正常关机,而是不保存设置的非正常关机,在开始菜单右键——关闭或注销——关闭计算机 ...

  7. Azure 基础:自定义 Table storage 查询条件

    本文是在 <Azure 基础:Table storage> 一文的基础上介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table s ...

  8. win7电脑定时开机设置方法

    在BIOS设置主界面中选择“Power Management Setup”,进入“电源管理”窗口. 注:缺省情况下,“Resume By Alarm”定时开机选项是关闭的. 将鼠标移到“Resume ...

  9. Azure 上通过Automation 实现定时开关虚拟机

    更多内容,请关注公众号: Azure Automation 可以提供一些自动化的功能,比如我们可以指定在每天早上6点开启虚拟机,每天晚上8点关闭虚拟机.同时还提供一些基于监控参数的自动化配置.今天的主 ...

随机推荐

  1. Linux命令-基本命令(1)

    1. ll dfdfdfd 2. vi dfffd

  2. hdu4821 String

    您也可以在我的个人博客中阅读此文章:跳转 题意 一个字符串S 问其中有几个子串能满足以下条件:1.长度为m*l2.可以被分成m个l长的不同的子串问题就变成了如何快速的判断着m个子串是否存在相同的 思路 ...

  3. Windows 10下Docker使用经验谈

    最近一直在开发Apworks框架的案例代码,同时也在一起修复Apworks框架中的Bug和一些设计上的不足.遇到的一个普遍问题是,代码的调试过程需要依赖很多外部系统,比如MongoDB.Postgre ...

  4. 走进 UITest for Xamarin.Forms

    上一篇  走进 Prism for Xamarin.Forms 讲了简单的创建一个项目,然后添加了几个页面来回切换,这篇想先搞下 UITest 官方详细地址:https://developer.xam ...

  5. h5实现照片墙效果

    <style> *{ margin: 0; padding: 0; } body{ background: url(images/bg.jpg); } #div1{ width: 100% ...

  6. LeetCode 55. Jump Game (跳跃游戏)

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  7. Hadoop完全分布式环境搭建

    前言 本文搭建了一个由三节点(master.slave1.slave2)构成的Hadoop完全分布式集群(区别单节点伪分布式集群),并通过Hadoop分布式计算的一个示例测试集群的正确性. 本文集群三 ...

  8. jerasure 2.0译文

    原文地址: 本文译者水平有限,如发现问题请批评指正 Jerasure 2.0:为方便存储相关应用开发的一个基于C开发的纠删码库 版本2.0 James S.Plank Kevin M.Greenan ...

  9. Android Weekly Notes Issue #281

    October 29th, 2017 Android Weekly Issue #281 本期内容不多,包含了小众DI库牙签帮助测试的文章,Kotlin中Delegate的强大之介绍,以及基于Goog ...

  10. Android: Only the original thread that created a view hierarchy can touch its views 异常

    最近自己再写一个小项目练手,创建一个线程从网络获取数据然后显示在 recyclerView 上.写好后发现页面能够显示,但是有时候会把请求的数据显示过来,有时候不会.点开 android monito ...