不知何时 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. 为啥REST如此重要?

    摘要:REST——表征状态转移,由于REST模式的Web服务更加简洁,越来越多的Web服务开始采用REST风格设计和实现.例如,Amazon.com提供接近REST风格的Web服务进行图书查找:雅虎提 ...

  2. 什么是GUID?

    定义及格式 1.全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系 ...

  3. 企业微信开发之发放企业红包(C#)

    一.企业微信API 地址:http://work.weixin.qq.com/api/doc#11543 二.参数说明 1.发送企业红包 请求方式:POST(HTTPS)请求地址:https://ap ...

  4. 【JDK1.8】JDK1.8集合源码阅读——HashMap

    一.前言 笔者之前看过一篇关于jdk1.8的HashMap源码分析,作者对里面的解读很到位,将代码里关键的地方都说了一遍,值得推荐.笔者也会顺着他的顺序来阅读一遍,除了基础的方法外,添加了其他补充内容 ...

  5. 脱壳第二讲,手动脱壳PECompact 2.x

    脱壳第二讲,手动脱壳PECompact 2.x PS: 此博客涉及到PE格式.所以观看此博客你要熟悉PE格式 首先,逆向inc2l这个工具,汇编中可能会用的 inc头文件转换为lib的工具 但是他有壳 ...

  6. 重写equals和hashCode

    equals()方法 1. 自反性:A.equals(A)要返回true. 2. 对称性:如果A.equals(B)返回true, 则B.equals(A)也要返回true. 3. 传递性:如果A.e ...

  7. LeetCode 695. Max Area of Island (岛的最大区域)

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  8. Appium python自动化测试系列之等待函数如何进行实战(九)

    ​9.1 等待函数的使用 9.1.1 为什么要使用等待函数 我们在做自动化的时候很多时候都不是很顺利,不是因为app的问题,我们的脚本也没问题,但是很多时候都会报错,比如一个页面本来就有id为1的这个 ...

  9. js接收html传值

    var obj = document.getElementById("orgName");无法获取输入框的值,获取的值为[object HTMLInputElement].用var ...

  10. 【机器学习实战】第12章 使用FP-growth算法来高效发现频繁项集

    第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...