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

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. python之json模块的基本使用

    json模块的作用:将字符串和字典相互转换 json和eval的区别: eval函数不能识别null转换成None json可以将null转换成python可以识别的None json序列化和反序列化 ...

  2. R/Bioconductor包的下载和安装,升级

    R包:基本包(自动加载)和推荐包(安装R时也会下载,但需要手动加载),拓展包(其他包,手动加载). 安装好的包将被放在一个指定的目录下.这个目录被称为库(Library).当需要使用到某一个包的时候, ...

  3. 五、golang实现排序

    实现排序: 1.实现一个冒泡排序 2.实现一个选择排序 3.实现一个插入排序 4.实现一个快速排序 冒泡排序 package main import( "fmt" ) func b ...

  4. linux文件系统实现原理简述【转】

    本文转载自:https://blog.csdn.net/eleven_xiy/article/details/71249365 [摘要] [背景] [正文] [总结]   注意:请使用谷歌浏览器阅读( ...

  5. flume 使用遇到问题及解决

    1. ../flume/fchannel/spool/data/ 目录下发生缓存文件积压 可能原因:同一时间同一客户端下向两个监控目录mv文件:或同一时间多个客户端向服务端上传文件 2.清空../fl ...

  6. 回溯法之k着色问题

    package main import ( "fmt" ) type Graphic struct { edges [][]int colors int color []int f ...

  7. 关于html的一些杂技

    html预定义字符指的是 :<   > html实体指的是 $amp 等 php中htmlspeciachar()就是讲html预定义字符转换成html实体. 浏览器渲染时,会将html实 ...

  8. Redis主键失效 - 原理及实现机制

    [数据记录过期源码][http://blog.csdn.net/yuanrxdu/article/details/21233047] [http://blog.jobbole.com/71095/] ...

  9. MSDN 单机 MVC 帮助文档

    因为微软的mvc框架也是从开源框架演变而来的,所以微软没把mvc帮助文档放到单击帮助文档中.sososos下载好msdn单机帮助后,却找不到 System.Web.MVC 等命名空间的东西. 解决办法 ...

  10. node——路由控制

    路由控制 前面我接触了如何使用express建立一个工程,虽然这个工程包含了一些基本的框架,但是没有实际内容,我们会不断给他增加的. 工作原理 我们在浏览器中访问app.js建立的服务器时,会出现一个 ...