公有云一个非常大的优势,就是可以根据需求进行开停机。由于计费是按时进行的,从而实现节省成本。

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开停机的更多相关文章

  1. BZOJ3838 : [Pa2013]Raper

    将选取的$A$看成左括号,$B$看成右括号,那么答案是一个合法的括号序列. 那么只要重复取出$k$对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可. 将$($看成$1$,$)$看成$-1$ ...

  2. 一套代码小程序&Web&Native运行的探索05——snabbdom

    接上文:一套代码小程序&Web&Native运行的探索04——数据更新 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/ma ...

  3. vue 源码学习三 vue中如何生成虚拟DOM

    vm._render 生成虚拟dom 我们知道在挂载过程中, $mount 会调用 vm._update和vm._render 方法,vm._updata是负责把VNode渲染成真正的DOM,vm._ ...

  4. Vue2.0源码学习(2) - 数据和模板的渲染(下)

    vm._render是怎么实现的 上述updateComponent方法调用是运行了一个函数: // src\core\instance\lifecycle.js updateComponent = ...

  5. 一文理解OpenStack网络

    摘要:如果你能理解OpenStack的网络,那么对于其他云平台的网络,应该也可以通过分析后理解掌握了. 本文分享自华为云社区<<跟唐老师学习云网络> - OpenStack网络实现& ...

  6. 如何利用Azure Automation以及Tag自动开关VM

    这是本博客第一篇技术相关的小贴士,在这里我不会详细介绍所涉及的技术组件的具体使用细节,因为我相信这些大家都可以通过官方文档了解到.如果你是一个看了官方文档依然一脸茫然的IT小白,个人建议是先从基础重新 ...

  7. 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好

    https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...

  8. vm.dirty_ratio & vm.dirty_background_ratio

    https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/ Better Lin ...

  9. 教程:在 VM Depot 中查找 Azure 可用的虚拟机镜像

     发布于 2014-07-08 作者 陈 忠岳 对于 Azure 的社区管理虚拟机资源库--VM Depot--的用户来说,网站的搜索功能已得到极大的改善.这一搜索能力的增强,可以帮助用户更容易地 ...

随机推荐

  1. display:inline-block 间隙

    IE6/7是不支持display:inline-block属性,只是让其表现的跟inline-block一样,尤其对于inline水平的元素,其表现度可以用perfect一词来形容了. 对于IE8+以 ...

  2. 20145239杜文超《网络攻防》- MSF基础应用

    20145239杜文超<网络攻防>- MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit:实现攻击行为的主体,但没有载荷只 ...

  3. [转载]Runtime详解

      Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢.我们从下面几个方面探寻Runtime的实现机制. Runtime介绍 Runtime消息传 ...

  4. 关于读取本地text文件,自动被添加空格的问题

    最近做一个小程序,读取本地指定路径下的text文件,逐行获取text文本然后再进行处理,结果遇到了一个奇葩问题,先插个图片给各位看官 坑:本地text文件中数据为1123/10(数据反复检查无空格,换 ...

  5. 斯坦福机器学习视频笔记 Week7 支持向量机 Support Vector Machines

    SVM被许多人认为是最强大的“黑箱”学习算法,并通过提出一个巧妙选择的优化目标,今天最广泛使用的学习算法之一. Optimization Objective 根据Logistic Regression ...

  6. 比较好的sql写法

    DECLARE @beginTime VARCHAR(20)= '2017-11-13 00:00:00';DECLARE @endTime VARCHAR(20)= '2017-11-13 23:0 ...

  7. BZOJ3668/UOJ2 [NOI2014]起床困难综合症

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. matplotlib柱状图

    import numpy as np import matplotlib.pyplot as plt size = 5 a = np.random.random(size) b = np.random ...

  9. DB2导入导出方法总结

    1.导出 DEL 文本文件  export to D:\T_TESTTABLE20121220.del of del select * from T_TESTTABLE 2.导出 ixf 文本文件.i ...

  10. HTML5 Audio/Video 标签属性与事件

    chrom 只测试过部分属性,均正常,兼容性未测试: 标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放controls:浏览器自带的控制条 1 标签属性 ...