在上述基本准备工做作完后,wo们看看如何实现利用Azure Automation实现定时自动开关机的操做,这种场景很是适合Dev/Test环境,由于Azure的虚拟机是按照分钟收费的,因此咱们能够在开发测试人员上班的时候打开虚拟机,而在下班,周末的时候关闭虚拟机,从而节约成本,从另一个层面来说,也是体现云的灵活性。git
首先讲一下设计的基本原则,如何作能让你的自动化脚本更灵活,更具备可移植性:github
参数化:尽可能不要在脚本中写死任何变量,负责除了修改代码,别无他法,并且可维护性会变的不好运维
合理使用资产:在Azure的automation中,有一部分配置是须要更新,变化的,因此这一部分配置应该放在资产中,让运维人员来修改,好比有哪些虚拟机须要开机,关机ide
模块化:通用的一些脚本能够写成runbook,以便于代码复用和共享模块化
1. 登入portal,选择新建runbook,选择从库中建立,你能够看到其实已经内置了不少的脚本,咱们选择Featured里面的Stop Azure Classic VMs,单机下一步,你能够看到脚本的定义:测试
2. 输入你但愿的runbook名称,选择咱们以前创建的自动化帐户,地区,选择完成将runbook添加到你的自动化帐户:spa
3. 打开自动化帐户,在runbook的tab下你就能够刚才建立的runbook Stop-AzureVMLib,点击这个runbook,选择创做,就能够看到这个脚本的所有源码,并能够修改,在底部设计
4. Runbook的基本结构以下,以workflow开头,后面是你的runbook名字,param是你的输入参数,outputtype里面定义了string类型的返回结果:日志
workflow Stop-AzureVMLiborm
{
param (
[Parameter(Mandatory=$false)]
[String] $ServiceName
)
# Returns strings with status messages
[OutputType([String])]
Body
}
5. 如今咱们设计一个Stop-VM的能够在实际环境中使用的runbook,实现如下几个目标:
用户能够配置哪些vm须要被定时中止,而不须要修改代码
认证信息能够被修改而不须要修改代码
周六周日不须要定时关机或者开机
详细的执行日志信息
6 . 使用Azure的用户名密码进行认证,相关的orgid,密码咱们都保存在资产中,经过动态得到,而不须要修改代码,经过Get-AutomationVariable获得的数据均可以在添加资产中添加变量得到:
#资产中定义的用户名和订阅名
$AzureCredentialAssetName = 'automationuser@XXXX.cn'
$AzureSubscriptionIdAssetName = 'automationsubid'
# 获得资产中定义的用户名密码和订阅名称
$Cred = Get-AutomationPSCredential -Name $AzureCredentialAssetName
$SubId = Get-AutomationVariable -Name $AzureSubscriptionIdAssetName
#得到须要关闭的虚拟机列表,以逗号分隔
$vmconfiglist = Get-AutomationVariable -Name 'vmnamelist'
$vmlist = $vmconfiglist -split ","
#得到认证,添加订阅进行后续操做
$null = Add-AzureAccount -Credential $Cred -Environment AzureChinaCloud -ErrorAction Stop
$null = Select-AzureSubscription -SubscriptionId $SubId -ErrorAction Stop
7. 那么若是使用证书的方式,如何得到认证昵?
$AzureSubscriptionIdAssetName = 'automationsubid'
$subscriptionNameAssetname = 'azuresubscriptionname'
#得到订阅ID和订阅名称
$SubId = Get-AutomationVariable -Name $AzureSubscriptionIdAssetName
$subscriptionName = Get-AutomationVariable -Name $subscriptionNameAssetname
#得到认证名称和证书
$certificateName = Get-AutomationVariable -Name "mycertificateName"
$certificate = Get-AutomationCertificate -Name $certificateName
#根据证书这是当前订阅
Set-AzureSubscription -SubscriptionName $subscriptionName -SubscriptionId $SubId -Certificate $certificate -Environment AzureChinaCloud -ErrorAction Stop
Select-AzureSubscription -SubscriptionId $SubId -ErrorAction Stop
8. 剩下的就是根据虚拟机机器名称获得虚拟机进行中止虚拟机的操做了,全部的源代码我都放在了Github,请分别下载测试:
经过用户名密码验证方式中止虚拟机:
https://github.com/kingliantop/azurelabs/blob/master/automation/stop-azurevms.ps1
经过用户名密码验证方式启动虚拟机:
https://github.com/kingliantop/azurelabs/blob/master/automation/start-azurevms.ps1
经过证书方式中止虚拟机:
https://github.com/kingliantop/azurelabs/blob/master/automation/stop-azurevmswithcert.ps1
经过证书方式启动虚拟机:
https://github.com/kingliantop/azurelabs/blob/master/automation/start-azurevmswithcert.ps1
9. runbook编辑完成,点击发布正式发布该runbook,但这个时候这些脚本不会自动运行,须要你设置定时运行方式,选择runbook中的计划日程,定义了何时运行这些脚本, 选择连接到新计划:
10. 输入计划的名称,设置天天定时关机的计划,你能够看到目前的设置选项中到小时级,或者天天,但没有工做日或者周末定义,须要本身写代码实现,具体实现请参考代码。
11. 每一个runbook都须要设置加护日程,经过这种方式,你就能够实现早上开机,晚上关机,周末不开关机等操做。