根据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--的用户来说,网站的搜索功能已得到极大的改善.这一搜索能力的增强,可以帮助用户更容易地 ...
随机推荐
- Docker容器技术-基础命令
一.基础命令 1.运行一个镜像 [root@bogon ~]# docker run debian echo "Hello World" Unable to find image ...
- 跨平台移动开发_PhoneGap API Camera 使用摄像头采集照片.
camera对象提供对设备默认摄像头应用程序的访问. 程序运行效果 相关代码 <!DOCTYPE html> <html> <head> <title> ...
- 线性代数:Ax=b的解
n列的矩阵A,当且仅当向量b是列空间C(A)的一个向量时,Ax=b有解. C(A)的零空间是N(A),N(A)正交补是A的行空间C(T(A)), 依据上一章的结论,任何Rn向量可以表示为r+n,其中n ...
- .NET自带泛型委托方法Func、Action和Predicate
Func.Action和Predicate是.NET自带的3个泛型委托方法,三个方法的区别其实并不大,要强行给混着用也是可以的,但是我们是有追求的人,把道理讲清楚总是好的. 一.Func是有返回值的方 ...
- XML 的解析方法
四种XML解析方法: (1)Dom生成和解析XML文档 *解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构. * 优点:整个文档树在内存中,便 ...
- HBase学习2(HBase shell)
HBase 常用命令 查看当前用户:whoami 创建表:create '表名', '列族名1','列族名2','列族名N' 查看所有表:list 描述表: describe '表名' 判断表存在: ...
- HDU 2480 Steal the Treasure (并查集+贪心)
题意:给你n个点,m条边,包括有向边与无向边,每条边都有一个权值.在每个点上都有一个人,他可以走与这个点直接相连的所有边中任意一条边一次,并且得到这个权值,就不能走了,注意这条路也只能被一个人走.问最 ...
- watcher
https://wiki.openstack.org/wiki/Watcher Watcher为OS提供资源优化.主要是通过虚拟机迁移来提高整个数据中心的运营效率,降低TCO. 功能特点: 通过虚拟机 ...
- The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files
要解决的话,方法有两个 1)可以选用较低版本的sdk,比如我就用回1.6版本的sdk window->preferences->Java->Installed JREs->Ad ...
- python基础5 - 产生随机数
随机数 在 Python 中,要使用随机数,首先需要导入 随机数 的 模块 —— “工具包” import random 导入模块后,可以直接在 模块名称 后面敲一个 . 然后按 Tab 键,会提示该 ...