Azure 基础 : 使用 Automation 定时开机
不知何时 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 定时开机的更多相关文章
- 免费电子书:微软Azure基础之Azure Automation
(此文章同时发表在本人微信公众号"dotNET每日精华文章") Azure Automation是Azure内置的一项自动化运维基础功能,微软为了让大家更快上手使用这项功能,特意推 ...
- Azure 基础:使用 powershell 创建虚拟机
在进行与 azure 相关的自动化过程中,创建虚拟主机是避不开的操作.由于系统本身的复杂性,很难用一两条简单的命令完成虚拟主机的创建.所以专门写一篇文章来记录使用 PowerShell 在 azure ...
- Azure 基础 : 使用 template 简化部署
笔者在前文中介绍了如何使用 PowerShell 脚本在 Azure 上创建虚拟主机.正如你所看到的,整个创建过程还是有点繁琐的,因为我们需要使用 PowerShell 脚本创建并关联所有相关的组件. ...
- Azure 基础:使用 powershell 创建虚拟网络
什么是虚拟网络 虚拟网络是您的网络在 Azure 云上的表示形式.您可以完全控制虚拟网络的 IP 地址.DNS 的设置.安全策略和路由表.您还可以更进一步,把虚拟网络划分为多个子网.然后用它们连接您的 ...
- Azure 基础:Blob Storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在前文中介绍了 Table Storage 的基本 ...
- 技嘉 gigabyte b75m d3v 主板 定时开机无效问题解决
BIOS 里面设置定时开机后发现到点并没有正常启动~~~ 百思不得解.后来发现原来是WIN8系统下的控制面板的关机并非正常关机,而是不保存设置的非正常关机,在开始菜单右键——关闭或注销——关闭计算机 ...
- Azure 基础:自定义 Table storage 查询条件
本文是在 <Azure 基础:Table storage> 一文的基础上介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table s ...
- win7电脑定时开机设置方法
在BIOS设置主界面中选择“Power Management Setup”,进入“电源管理”窗口. 注:缺省情况下,“Resume By Alarm”定时开机选项是关闭的. 将鼠标移到“Resume ...
- Azure 上通过Automation 实现定时开关虚拟机
更多内容,请关注公众号: Azure Automation 可以提供一些自动化的功能,比如我们可以指定在每天早上6点开启虚拟机,每天晚上8点关闭虚拟机.同时还提供一些基于监控参数的自动化配置.今天的主 ...
随机推荐
- 奥利奥好吃吗?Android 8.0新特性适配测试报告来啦!
WeTest 导读 谷歌2017 I/O开发者大会上发布了Android 8.0的正式版, 其官方代号为Oreo(奥利奥).网上关于Android8.0新功能特性的介绍已铺天盖地,新功能特性会对程序应 ...
- WPF 绑定密码
我们发现我们无法绑定密码框的密码,PasswordBox 的 Password 不能绑定. 我们想做 MVVM ,我们需要绑定密码,不能使用前台 xaml.cs 监听 密码改变得到密码的值,传到 Vi ...
- MySQL基础函数
MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: 系统信息函数: 加密函数: 格式化函数: 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ...
- python分布式环境下的限流器
项目中用到了限流,受限于一些实现方式上的东西,手撕了一个简单的服务端限流器. 服务端限流和客户端限流的区别,简单来说就是: 1)服务端限流 对接口请求进行限流,限制的是单位时间内请求的数量,目的是通过 ...
- linux命令行下svn常用命令
linux命令行下svn常用命令 1. 将文件checkout到本地目录 1 #path是服务器上的目录 2 svn checkout path 3 4 #示例 5 svn checkout svn: ...
- Linux下如何高效删除一个几十G的文本文件的最后一行或几行
当我们在服务器端记录日志或文本数据时,有时候会有需要删除一个大文件的最后几行,这时如何才能高效实现. 上网浏览终于找到dd命令,亲测如下,删除一个32GB的日志文件最后100行仅需要4分钟 [root ...
- 不定期更新的CSS样式设置
头像图片的样式 假设这是一个头像图片,假设展示头像的框为100*100的div,而图片尺寸为510*765,如何让图片显示成这样呢? html结构很简单: <div class="im ...
- bug:逆向思维的延伸
哈哈,我又来了. 前段时间自己出了一个bug,说起来也属于比较常见的类型 A业务需要做一个活动,需要B业务判断,如果是通过A业务跳转至B业务的用户,则在B页面给这类用户展示一个对应的弹窗.(A是新增业 ...
- Java 设计模式原则
1. 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起. 换句话说,如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要抽出来,和其 ...
- HDU 4325 Flowers(树状数组)
Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...