根据VM的TAG开停机
公有云一个非常大的优势,就是可以根据需求进行开停机。由于计费是按时进行的,从而实现节省成本。
Azure上用脚本按时开停机已经有很多部署的案例。本文将介绍采用VM Tag中规定的时间进行开停机的脚本。
Tag是Azure ARM模式中的一个资源的属性。用户可以根据需求对这个资源进行标识,以便在后期的操作中进行分组操作,比如积分信息的收集。

具体实现如下:
一 开关机需求:
根据内网IP地址列表检查VM上的TAG信息,提取TAG名称是指定的键值对。这个键值对的值应该是一个时间段,在这个时间段内,VM应该处于关机状态。
二 实现思路:
在Windows机器里订阅任务计划,每10分钟运行一次脚本。
脚本的内容:
1 脚本读取csv文件,文件中包含IP地址和TAG的名称
2 根据IP地址列表查找机器
3 提取VM的TAG信息, CSV文件中定义了TAG的名称,将是这个名称的TAG取出,并将其值取出,这个值应该是一个时间段,前面一个是关机时间,后面一个是开机时间
4 获取当前时间
5 当前时间与TAG时间进行比较,根据策略进行开关机
三 脚本和文件
1 CSV文件
|
address |
tag |
|
10.206.5.7 |
test |
|
10.206.5.11 |
test |
2 PowerShell脚本
function modifyvm-basedontag{
param(
#csv文件的路径
[Parameter(Mandatory=$true)]
[String]$csvfilepath
)
#导入CSV文件
$inputvalues = Import-Csv -Path $csvfilepath
#获取网卡信息,以便通过内网ip地址进行操作
$nics = Get-AzureRmNetworkInterface
#对CSV中的内容逐条进行处理
foreach($input in $inputvalues){
#获取内网IP的NIC信息
foreach($nic in $nics){
$tempa = $nic.IpConfigurations[0].PrivateIpAddress.ToString()
$tempb = $input.address.ToString()
if ($tempa -eq $tempb){
break}
}
#IP地址对应的VM名称
$vmname = $nic.VirtualMachine.Id.Split('/')[-1]
#获取VM的TAG信息,TAG信息从CSV中获取
$vmtag = Find-AzureRmResource -TagName $input.tag | Where-Object {$_.resourcetype -like "Microsoft.Compute/virtualMachines"} | Where-Object {$_.name -match $vmname}
#如果没有此TAG,程序退出
if(!$vmtag){write-host "please check the tag's name"; exit}
#获取此VM
$vm= get-azurermvm -ResourceGroupName $vmtag.ResourceGroupName -Name $vmtag.Name
#VM TAG的key信息
$tKeys = $vm.Tags| select -ExpandProperty keys
#VM TAG的值
$tvalues = $vm.Tags | select -ExpandProperty values
#如果VM没有TAG,程序退出
if($vm.Tags.Count -eq 0){write-host "this VM has no tag"; exit}
#如果VM的TAG有一个,如下操作
if($vm.Tags.Count -eq 1){
if($tKeys -eq $input.tag){$time = $tvalues}
}
#如果VM TAG值超过一个,如下操作
else
{
for($i=0;$i -lt $vm.tags.Count; $i++){
if($tKeys[$i] -eq $input.tag){$time = $tvalues[$i];write-host $time;break}
}
}
#获取目前的时间
$now = get-date
write-host "Now is $now"
write-host "VM stop time is $time"
#tag的前面时间是关机时间,后面是开机时间。之间表示关机时间
$stoptime=get-date $time.Split('-')[0]
$starttime=get-date $time.Split('-')[1]
#如果开机时间小于关机时间,说明日期需要加1
if($starttime -le $stoptime){$starttime = $starttime.AddDays(1)}
#获取VM的Power状态
$status = get-azurermvm -ResourceGroupName $vmtag.ResourceGroupName -Name $vmtag.Name -Status
$vmstatus=$status.Statuses[1].Code.Split('/')[-1]
#在VM处于运行状态时:
if($vmstatus -eq "running"){
#小于停止时间,不做操作
if($now -lt $stoptime){write-host "it's time to run vm, and VM is running, do nothing"}
#大于停止时间,小于开机时间,停机
if(($now -gt $stoptime) -and ($now -lt $starttime)){write-host "VM is running, it is time to stop"; #stop-azurermvm -ResourceGroupName $vmtag.ResourceGroupName -Name $vmtag.Name -Force
}
#大于开机时间,不做操作
if($now -gt $starttime) {write-host "it's time to start the vm, and the vm is running, do nothing"}
}
#机器处于停机状态
else{
#小于停机时间,开机
if($now -lt $stoptime){write-host "it's time to start VM, and the vm is stopped, start it"; #start-azurermvm -ResourceGroupName $vmtag.ResourceGroupName -Name $vmtag.Name
}
#大于开机时间,小于停机时间,不做操作
if(($now -gt $stoptime) -and ($now -lt $starttime)){write-host "it is time to stop, and the VM is stopped, do nothing"}
#大于开机时间,开机
if($now -gt $starttime) {write-host "it's time to start the vm, and the vm is stopped, start it";
#start-azurermvm -ResourceGroupName $vmtag.ResourceGroupName -Name $vmtag.Name
}
}
}
}
modifyvm-basedontag -csvfilepath D:\a.csv
根据VM的TAG开停机的更多相关文章
- BZOJ3838 : [Pa2013]Raper
将选取的$A$看成左括号,$B$看成右括号,那么答案是一个合法的括号序列. 那么只要重复取出$k$对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可. 将$($看成$1$,$)$看成$-1$ ...
- 一套代码小程序&Web&Native运行的探索05——snabbdom
接上文:一套代码小程序&Web&Native运行的探索04——数据更新 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/ma ...
- vue 源码学习三 vue中如何生成虚拟DOM
vm._render 生成虚拟dom 我们知道在挂载过程中, $mount 会调用 vm._update和vm._render 方法,vm._updata是负责把VNode渲染成真正的DOM,vm._ ...
- Vue2.0源码学习(2) - 数据和模板的渲染(下)
vm._render是怎么实现的 上述updateComponent方法调用是运行了一个函数: // src\core\instance\lifecycle.js updateComponent = ...
- 一文理解OpenStack网络
摘要:如果你能理解OpenStack的网络,那么对于其他云平台的网络,应该也可以通过分析后理解掌握了. 本文分享自华为云社区<<跟唐老师学习云网络> - OpenStack网络实现& ...
- 如何利用Azure Automation以及Tag自动开关VM
这是本博客第一篇技术相关的小贴士,在这里我不会详细介绍所涉及的技术组件的具体使用细节,因为我相信这些大家都可以通过官方文档了解到.如果你是一个看了官方文档依然一脸茫然的IT小白,个人建议是先从基础重新 ...
- 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好
https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...
- vm.dirty_ratio & vm.dirty_background_ratio
https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/ Better Lin ...
- 教程:在 VM Depot 中查找 Azure 可用的虚拟机镜像
发布于 2014-07-08 作者 陈 忠岳 对于 Azure 的社区管理虚拟机资源库--VM Depot--的用户来说,网站的搜索功能已得到极大的改善.这一搜索能力的增强,可以帮助用户更容易地 ...
随机推荐
- eclipse设置高亮显示的颜色
设置高亮显示的颜色:Window-->preferences-->General-->Editors-->Text Editors-->Annotations--> ...
- rollingstyle in log4net
https://stackoverflow.com/questions/734963/log4net-rollingfileappender-with-composite-rolling-style- ...
- 【P2964】硬币的游戏(DP+前缀和)
一道DP,思维难度真是不小. 首先对于这个题的数据,我们可以发现差不多可以支持n^2logn,但是貌似也不会有这种复杂度的线性DP(至少这个题看上去不是这样).所以我们考虑N^2做法.因为求得是价值和 ...
- 泛型学习第三天——C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
定义一个类: public class UserInfo { public System.Guid ID { get; set; } public string LoginName ...
- JavaWeb -- Jsp 和 JavaBean
JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为: <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件. <jsp ...
- SVG_style_script
1. <style type="text/css"> <![CDATA[ // ZC: 禁止所有 <text/>元素的选中 text { -webki ...
- 【LABVIEW到C#】2》database的操作(一)之 创建access和创建表单
namespace添加如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 微软面向高并发应用而推出的新程序库——TPL Dataflow
TPL Dataflow库的几个扩展函数 TPL Dataflow是微软面向高并发应用而推出的新程序库.借助于异步消息传递与管道,它可以提供比线程池更好的控制.本身TPL库在DataflowBlock ...
- Uninstall Office 2016 for Mac
官方原文:https://support.office.com/en-us/article/Uninstall-Office-2016-for-Mac-eefa1199-5b58-43af-8a3d- ...
- Ubuntu下使用tmux实现分屏,以及tmux快捷键
最近用到了终端的复用,使用了tmux,写一下自己的使用和一些快捷键. tmux是指通过一个终端登录远程主机并运行后,在其中可以开启多个控制台的终端复用软件. 来个效果图: 截图我使用的命令是 gno ...