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

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. Listening Carefully SP1403S

    Listening Carefully仔细聆听When people talk, listen completely. Most people never listen. ―Ernest Heming ...

  2. 八、linux优化一

    1.关闭selinux sed –I ‘s#SELINUX=enforcing#SELINUX=disabled#g’ /etc/selinux/config grep SELINUX=disable ...

  3. ARC 与非ARC 之间的转换,以及如何使一个项目中,ARC与非ARC共存

    1,非ARC 转 ARC的操作 XCode 的 Edit -- Refactor -- Convert to Object-C ARC (注意,一般在一个大项目中,很少直接使用此方法,其正确率有待考虑 ...

  4. Pandas标记删除重复记录

    Pandas提供了duplicated.Index.duplicated.drop_duplicates函数来标记及删除重复记录 duplicated函数用于标记Series中的值.DataFrame ...

  5. Linux下安装lrzsz上传下载工具

    使用yum安装 为什么要使用yum安装? 答:安装十分方便,几乎不需要别的操作,只需要一个yum命令就可以完成所有的安装过程. yum -y install lrzsz  要有网络才行 输入命令:rz ...

  6. Java正则表达中Greedy Reluctant Possessive 的区别

    Java正则表达中Greedy Reluctant Possessive 的区别 分类: java2015-01-16 00:28 1280人阅读 评论(9) 收藏 举报 正则表达式Java   目录 ...

  7. Javascript的this用法---阮一峰

    Javascript的this用法   作者: 阮一峰 日期: 2010年4月30日 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比 ...

  8. 循环插入一条数据的sql写法

    DECLARE @i INTSET @i = 1WHILE @i > 0 BEGIN DECLARE @TransportFormMstID BIGINT; DECLARE @TradeOrde ...

  9. MVP实战心得—封装Retrofit2.0+RxAndroid+RxBus

    响应式编程框架,rxjava的扩展,很爽的链式编程 魅力在于对数据的处理,与线程切换的灵活性. 用来处理异步操作(Lambda表达式不会用.用Lambda表达式代码会更少,但不会的人会看不懂代码.不是 ...

  10. review28

    前面介绍了指向文件的输入流和输出流.随机流是既能读文件也能写文件. RandomAccessFile类创建的流称做随机流,与前面的输入.输出流不同的是,RandomAccessFile类既不是Inpu ...