本文目录
PowerShell中文博客原创Set-AzureVMPowerStateOnSchedule帮助您定时启动和关闭Azure虚拟机,来最大限度节约您的IT成本。
背景
在测试环境中,比如我在安装一个SAP HANA 数据库实例,需要两台型号为DS14(16核CPU,126GB)的虚拟机,每台每月大概近1万人民币左右的成本,如果做完实验恰好忘记关机了,后果不堪设想呢?虽然钱不是我出,但浪费可耻,不符合中央八项规定。
所以最好在做实验前,就规划好,每天几点开机,其他时间要关机。借助于Set-AzureVMPowerState和Windows 计划任务或者Azure Automation Runbook可以很方便地完成该需求。
功能亮点
安全的设计
使用Azure service principal 访问虚拟机,静默登陆,更加安全地访问仅在Azure的访问控制中授权的资源。
灵活的开机计划配置
- 你可以针对一批虚拟机配置一个全局开机计划集合,比如星期一,9:00-16:00开机;星期二,星期三 16:00-04:00开机。
- 也可以针对不同的虚拟机配置不同的开机计划集合,比如vm1,星期一,9:00-16:00开机;vm2, 星期二,22:00-23:00开机。
- 脚本运行时,根据开机计划时间配置计算出当前机器的期望值为开机,而实际状态为关机,则调用Start-AzureRmVM 进行开机;如果期望值为关机,而实际值为开机,则调用Stop-AzureRMVM 进行关机。
方便与Azure Automation Runbook和Windows 计划任务集成
本脚本兼容支持使用自定义的Service Principal 账号在Windows 计划任务中运行,也支持使用Azure Automation 账号在Azure Runbook中运行。
脚本依赖
- Windows PowerShell 5.1 + (其他版本未测试)
- Microsoft Azure PowerShell model 5.6.0 +
如何开始
- 创建 Azure AD 应用 并记录下面几个参数的值,然后把它保存在配置文件vm-power-state-config.json 的ServicePrincipal 结点 :
"ServicePrincipal": {
"SubscriptionId": "c4698380-b489-4659-b95b-ca4bb8c7d602",
"TenantId": "9da1f20e-f031-41fb-9d45-5c994d54753b",
"ApplicationId": "34f3c0a3-c214-49b1-b960-eaeb421d2486",
"AuthKey": "0fvxa97ANbCEA8ScWJhfSxD0Za1dK2LNpQ3zqcaMjdw="
},
- 按照如下格式配置资源组名称和虚拟机名称:
"ResourceGroup": [
{
"Name": "resource-group-name-1",
"VM": [
{
"Name": "vm-name-1",
},
{
"Name": "vm-name-2"
},
{
"Name": "vm-name-3"
}
]
}
],
- 按照如下格式给所有虚拟机配置一个全局开机计划,并给vm-name-1单独配置一个开机计划:
注意 : 虚拟机内部的开机计划配置会覆盖全局开机计划
"ResourceGroup": [ { "Name": "resource-group-name-1", "VM": [ { "Name": "vm-name-1", "OnlineSchedule": [ { "DayOfWeek": [ "Monday", "Tuesday" ], "FromTime": "06:00", "ToTime": "18:00" }, { "DayOfWeek": [ "Thursday", "Friday" ], "FromTime": "09:00", "ToTime": "12:00" } ] }, { "Name": "vm-name-2" }, { "Name": "vm-name-3" } ] } ], "OnlineSchedule": [ { "DayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "FromTime": "04:00", "ToTime": "18:00" } ] }
- 在本地控制台测试你的脚本和参数.
PS D:\Set-AzureVMPowerStateOnSchedule> .\Set-AzureVMPowerStateOnSchedule.ps1
后续集成
Automation Runbooks 集成
- 参考文档 PowerShell runbook guide page 创建 runbook.
- 更新配置文件 设置 IsAzureAutomationLogin=true, 同时添加 AzureAutomationConnectionName 的值到ServicePrincipal 结点下:
"IsAzureAutomationLogin": false,
"ServicePrincipal": {
"AzureAutomationConnectionName": "AzureRunAsConnection"
},
- 复制 Set-AzureVMPowerStateOnSchedule.ps1 的脚本内容到runbook的源脚本编辑框,替换变量 $configText‘s 的初始值,脚本中使用的读取配置文件,这里我们用内嵌脚本HERE-STRING的格式。 .
# Read json configuration file
# $configText = Get-Content "$PSScriptRoot\vm-power-state-config.json"
$configText = @"
{
"IsAzureAutomationLogin": true,
"ServicePrincipal": {
"AzureAutomationConnectionName": "AzureRunAsConnection"
},
......
"@
- 在 [测试面板中], 运行和调试你的脚本, 可能的输出如下
- 为Runbook设置一个定时任务计划,负责检测和重置VM状态。
Windows 计划任务集成
目前需要用户自己根据开机计划配置计划任务的触发器,后续会增加一个辅助脚本,协助用户一键配置计划任务。
本文链接: https://www.pstips.net/set-azurevmpowerstateonschedule.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
文章不错非常喜欢