PowerShell定时启动/关闭Azure虚拟机 1


PowerShell中文博客原创Set-AzureVMPowerStateOnSchedule帮助您定时启动和关闭Azure虚拟机,来最大限度节约您的IT成本。

背景

在测试环境中,比如我在安装一个SAP HANA 数据库实例,需要两台型号为DS14(16核CPU,126GB)的虚拟机,每台每月大概近1万人民币左右的成本,如果做完实验恰好忘记关机了,后果不堪设想呢?虽然钱不是我出,但浪费可耻,不符合中央八项规定。

所以最好在做实验前,就规划好,每天几点开机,其他时间要关机。借助于Set-AzureVMPowerStateWindows 计划任务或者Azure Automation Runbook可以很方便地完成该需求。

功能亮点

安全的设计

使用Azure service principal 访问虚拟机,静默登陆,更加安全地访问仅在Azure的访问控制中授权的资源。

灵活的开机计划配置

  1. 你可以针对一批虚拟机配置一个全局开机计划集合,比如星期一,9:00-16:00开机;星期二,星期三 16:00-04:00开机。
  2. 也可以针对不同的虚拟机配置不同的开机计划集合,比如vm1,星期一,9:00-16:00开机;vm2, 星期二,22:00-23:00开机。
  3. 脚本运行时,根据开机计划时间配置计算出当前机器的期望值为开机,而实际状态为关机,则调用Start-AzureRmVM  进行开机;如果期望值为关机,而实际值为开机,则调用Stop-AzureRMVM 进行关机。

方便与Azure Automation Runbook和Windows 计划任务集成

本脚本兼容支持使用自定义的Service Principal 账号在Windows 计划任务中运行,也支持使用Azure Automation 账号在Azure Runbook中运行。

脚本依赖

  1. Windows PowerShell 5.1 + (其他版本未测试)
  2. Microsoft Azure PowerShell model 5.6.0 + 

如何开始

  1. 创建 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="
    },
  1. 按照如下格式配置资源组名称和虚拟机名称:
    "ResourceGroup": [
        {
            "Name": "resource-group-name-1",
            "VM": [
                {
                    "Name": "vm-name-1",
                },
                {
                    "Name": "vm-name-2"
                },
                {
                    "Name": "vm-name-3"
                }
            ]
        }
    ],
  1. 按照如下格式给所有虚拟机配置一个全局开机计划,并给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"
        }
    ]
}
  1. 在本地控制台测试你的脚本和参数.
PS D:\Set-AzureVMPowerStateOnSchedule> .\Set-AzureVMPowerStateOnSchedule.ps1

后续集成

Automation Runbooks 集成

  1. 参考文档 PowerShell runbook guide page 创建 runbook.
  2. 更新配置文件 设置 IsAzureAutomationLogin=true, 同时添加 AzureAutomationConnectionName 的值到ServicePrincipal 结点下:
    "IsAzureAutomationLogin": false,
    "ServicePrincipal": {
        "AzureAutomationConnectionName": "AzureRunAsConnection"
    },
  1. 复制 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"
    },
......
"@
  1. 在 [测试面板中], 运行和调试你的脚本, 可能的输出如下

  1. 为Runbook设置一个定时任务计划,负责检测和重置VM状态。

Windows 计划任务集成

目前需要用户自己根据开机计划配置计划任务的触发器,后续会增加一个辅助脚本,协助用户一键配置计划任务。

×用微信扫描并分享
本文链接: https://www.pstips.net/set-azurevmpowerstateonschedule.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。


发表评论

电子邮件地址不会被公开。 必填项已用*标注

一条评论 “PowerShell定时启动/关闭Azure虚拟机