如何利用Azure Automation以及Tag自动开关VM
这是本博客第一篇技术相关的小贴士,在这里我不会详细介绍所涉及的技术组件的具体使用细节,因为我相信这些大家都可以通过官方文档了解到。如果你是一个看了官方文档依然一脸茫然的IT小白,个人建议是先从基础重新学起再来看具体的需求和方案。
在这片文章里我们会涉及到两个概念,一个是Azure automation,另外就是resource的tag。
Tag这个我就不多说了,绝大多数系统或者平台都会带有的Key-value标识功能。
Automation的话,至少要了解runbook, job, schedule 这几个基本的概念才能继续往下看。
需求:为了避免不必要的资源浪费,许多测试开发环境可以在非工作时间进行关机来达到节约成本的目的。
如果贵公司钱多的烧不完,则可以自豪的忽略这个需求。
话不多说先贴上runbook供大家参考:

workflow Autoshutdown_by_tag
{
$connectionName = "AzureRunAsConnection"
try
{
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint `
-EnvironmentName AzureChinaCloud
}
catch {
if (!$servicePrincipalConnection)
{
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
} else{
Write-Error -Message $_.Exception
throw $_.Exception
}
}
$subs = Get-AzureRmSubscription
Foreach ($sub in $subs)
{
Select-AzureRmSubscription -SubscriptionId $sub.SubscriptionId -ErrorAction Continue
$VMs = Get-AzureRmVm -status| Where-Object {$_.Tags.Keys -eq "AutoShutdown" -and $_.Tags.Values -eq "Yes" }
ForEach -Parallel -ThrottleLimit 10 ($VM in $VMs)
{
If ($vm.powerstate -eq "VM deallocated")
{Write-Output "$($VM.Name) is already shutdown"}
else
{Write-Output "Stop: $($VM.Name)";Stop-AzureRMVM -Name $VM.Name -ResourceGroupName $VM.ResourceGroupName -force }
}
}
}

具体说明:
1. 首先这个runbook的目的就是遍历你的账号下所有订阅下用有标签Autoshutdown并且值为Yes的虚拟机,并检测他们的powerstate, 如果不是 deallocated 状态则执行stop-AzureRMVM 命令进行关机。标签和值可以完全按照各自喜好自定义。
2. 此runbook需要关联相对应的schedule才能按时执行,具体如何操作就不深入阐述了。
3. 此Automation的run as account不能expired, 同时必须要对对应的虚拟机拥有开关机的权限。RBAC中自定义role这块我之后会有专门的文章介绍,这里就不深入阐述。
4. 这里用的是workflow,而不是普通的powershell脚本。最主要的优势是可以做到并行操作。 ”ForEach -Parallel -ThrottleLimit 10“在这里就设置了最多同时进行10台虚拟机的关机操作。当你的云平台上有大量的虚拟机时,顺序操作会消耗大量的脚本运行时间,一般来说一台虚拟机的关机动作5到10分钟不等,数量一大可能你的job就会超时。
5. 开机的runbook与关机类似,只是用到的是start-AzureRMVM命令。 另外在新的AzureRM.Compute 模块中,stop-AzureRMVM会有需要人机交互进行确认,因此需要使用 -force 强制执行,这个小tip可以使用在任何其他的类似的powershell命令中。
其实这里涉及到了一些其他的知识点,有一些我会在其他的小贴士中详细介绍。但是如果你只是想单纯的让这个功能跑起来,其实还是非常容易的。
对于一个IT从业人员,如果只是知其然也是可以混口饭吃的。但是一旦遇到高手依然会原形毕露,被别人鄙视一番也是自然。因此我们还是得知其所以然。
一般来说IT知识的掌握分为四个阶段: User-->Know what--->troubleshooting--->Expert。 如果是技术相关岗位,至少也要在自己的专业领域达到Troubleshooting或者expert级别,而对其他的至少要做到know what。这里又涉及到了知识体系的搭建,在之后我也会分享一些相关的体会。
希望这篇文章可以对日常维护Azure 的朋友们有所启发,如果有什么建议欢迎留言讨论。
如何利用Azure Automation以及Tag自动开关VM的更多相关文章
- 利用Azure Automation实现云端自动化运维(4)
在上述基本准备工作做完后,wo们看看如何实现利用Azure Automation实现定时自动开关机的操作,这种场景非常适合Dev/Test环境,因为Azure的虚拟机是按照分钟收费的,所以我们可以在开 ...
- 利用Azure Automation实现云端自动化运维(3)
Azure automation的认证方式:证书 该种方式是推荐的进行Automation认证的方式,好处在于安全性高,过期时间由自己控制,不好的地方在于大家在Windows上要生成证书比较麻烦, ...
- 利用Azure Automation实现云端自动化运维(1)
Azure Automation是Azure上的一个自动化工作流引擎,基于Powershell,来帮助用户简化,集成和自动化Azure上的运维工作,例如: 实现定时开关虚拟机,节约成本 实现定时创建删 ...
- 利用Azure Automation实现云端自动化运维(2)
Azure automation的认证: 用户名和密码 在Azure的automation中使用Powershell可以管理当前订阅的资源,也可以管理不同订阅的资源,那么问题就来了,安全性如何 ...
- Step by Step 用Azure Automation 来开虚机(ARM)
使用Azure Automation来自动化处理各种重复的耗时的云管理任务从而帮助云运维人员提升效率,帮助降低运营成本. 具体相关的介绍以及怎样利用Azure Automation来完成定期开关虚拟机 ...
- 免费电子书:微软Azure基础之Azure Automation
(此文章同时发表在本人微信公众号"dotNET每日精华文章") Azure Automation是Azure内置的一项自动化运维基础功能,微软为了让大家更快上手使用这项功能,特意推 ...
- 新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD Application Key
新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD应用的Key 前篇讲过有一个面向公众的Runbook库,社区和微软一直往其中加入新的Runbook, ...
- 使用Azure Automation(自动化)定时关闭和启动虚拟机
1. 概述 作为Windows Azure的用户,使用Azure的过程中,最担心的事情就是还没到月底,预设的费用就快消耗完了(下面两张账单图是我最讨厌看到的).但是仔细分析自己的费用列表,发现绝大部分 ...
- 利用Azure嵌套虚拟化,解决公有云上机器不能启动的问题
很多时候我们都会碰到因为意外重启,机器硬盘被损坏导致无法启动,或者是因为各种原因Windows上的RDP服务启动不了,Linux上的SSH无法链接等等问题.碰到这种问题基本上很难解决以前都是将VHD下 ...
随机推荐
- Codility--- NumberOfDiscIntersections
Task description We draw N discs on a plane. The discs are numbered from 0 to N − 1. A zero-indexed ...
- ansible(三)
一.setup模块(收集信息 ) 1.ansible中的setup模块可以收集到的信息 ansible web -m setup ansible_all_ipv4_addresses # ipv4的所 ...
- 每日一问:浅谈 onAttachedToWindow 和 onDetachedFromWindow
基本上所有 Android 开发都会接触到 onCreate().onDestory().onStart().onStop() 等这些生命周期方法,但却不是所有人都会去关注到 onAttachXXX( ...
- 文件识别浅谈(含office文件区分)
前言 本文主要根据后台接口识别Office文件类型这一话题做一些分享,主要方向还是放在不能获取到文件名情况下的Office文件识别. 可获取到文件名 如果后端接口可以获取到完成的文件名称,则整个过程会 ...
- 自定义实现一个loghub(或kafka)的动态分片消费者负载均衡?
一般地,像kafka之类的消息中间件,作为一个可以保持历史消息的组件,其消费模型一般是主动拉取方式.这是为了给消费者足够的自由,回滚或者前进. 然而,也正是由于将消费消息的权力交给了消费者,所以,消费 ...
- java多线程死锁
进程(线程)同步的基本概念 进程之间的制约关系 1. 直接制约关系(进程同步) 这个关系主要源于进程合作,例如,有一个输入进程A通过单缓冲向进程B提供数据,当该缓冲空时,进程B因为不能获得所需数据而被 ...
- 【React】react学习笔记01-概念与基本使用
俺为啥要学这玩意: 家里的杂事好不容易处理完了,开始正式静下心来学习~博主是做后端开发的,js基础不深,之前也是用React写过许多东西了,但是基本上都是用的CV大法,别人的组 件修修改改拿来 ...
- Spring Dl解释
在UserService中提供一个get/set的name方法,在beans.xml中通过property去注入 一个实现类的属性 name; 3.1 类路径获得配置文件 3.4 BeanFactor ...
- 并发编程-concurrent指南-ReadWriteLock
ReadWriteLock也是一个接口,在它里面只定义了两个方法: public interface ReadWriteLock { /** * Returns the lock used for r ...
- 并发编程-concurrent指南-ConcurrentMap
ConcurrentMap 是个接口,你想要使用它的话就得使用它的实现类之一. ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合: 在原有java.ut ...