WSFC 群集编排任务计划
任务计划是操作系统中重要的组件,通过任务计划,电脑可以自动帮助我们在某条件下触发某操作,以完成任务
对应到现实生活类似于现在的智能电饭锅,你每天早上需要吃早餐,但是又不想做,就用智能电饭锅做了个定时操作,每天早上七点,用小火帮我煮好粥,到点起来吃就可以了,操作系统中的任务计划也是相通的概念,意义在于通过电脑自动帮助我们完成任务,不用每次亲力亲为
任务计划通常被用于操作系统或后端的应用程序,例如定期执行审核收集脚本,定期生成硬件报告,定期处理应用程序缓存,等等
高级电脑用户可以用任务计划,自动帮助我们执行某事,例如你知道今天下午三点要做某事,但是你三点有事不在,就可以做个任务计划,到时间电脑自动帮你完成
企业IT管理员可以用任务计划,帮助我们来完成自动化的服务器收集监视,或需要重复性执行的操作
应用开发人员可以用任务计划,定期自动执行应用程序所需配置,例如定期启动某个exe,定期处理某个缓存
当我们提任务计划,通常我们是指计划某事,然后做某事,而不仅仅是计划,因此电脑中的任务计划与日历提醒有所区别,所谓的提醒软件只是提醒你去做某事,但不会帮你去做
任务计划在Windows Server 上面和Windows Client 上面都有,最早老王记得Server 2000上面就曾看到过,那时它叫做任务计划,一直到2003,2003任务计划和2000时代并不太大差别,当创建任务计划时会跑一个向导,可以指定任务要执行的程序,运行任务的周期,每天,每周,每月,一次性,计算机启动时,登录时,执行任务密码,创建完成后任务计划可以在控制面板-任务计划文件夹下看到
到了Sever 2008和vista时代,任务计划得到了增强,改名为任务计划程序,移至管理工具中,里面将任务计划更明确的划分为 触发器 - 操作 - 条件 三个层级,满足什么触发前提下触发任务计划,触发之后要执行什么操作,执行操作之前有哪些条件需要满足,例如可以设定只在操作系统空闲时间执行等等,对于界面上面显示也更加友好,支持显示任务历史执行记录,支持导出任务,导入任务
在那个时代不像现在,那时代微软还没有powershell3.0,DSC,SCO这些强大的自动化工具,那时微软自身并没有太多自动化工具,因此,如果管理员需要执行一些自动化管理操作,通常会选择ps1+任务计划,VBS+任务计划,BAT+任务计划,写好一个脚本,然后配合任务计划,定期执行
到了Powershell 3.0,Windows Server 2012,任务计划程序得到了更进一步的增强,支持直接通过Powershell去管理创建任务计划,更加的灵活方便
示例:
注册任务计划操作,已注册的Job不会因为Powershell的控制台关闭而消失
Register-ScheduledJob -Name querydriver -ScriptBlock {driverquery }
创建任务计划操作变量
$job=Get-ScheduledJob -Name querydriver
创建任务计划触发器
下午七点半执行,每隔五天执行一次
$jobtrigger=New-JobTrigger -Daily -At "19:30 PM" -DaysInterval 5
为任务计划操作分配触发器
$job=Get-ScheduledJob -Name querydriver | Add-JobTrigger -Trigger $jobtrigger
Powershell创建的任务计划将在后台异步执行,同样也是底层调用了任务计划,只不过通过powershell包上一层,管理起来更加灵活,创建完成的任务计划可以在任务管理程序 taskschd.msc 里面看到,Powershell 创建的任务计划位于Windows - Powershell - ScheduledJobs文件夹
查看任务计划
Get-ScheduledJob -Name querydriver
删除任务计划
Get-ScheduledJob -Name querydriver | Unregister-ScheduledJob
禁用任务计划
Get-ScheduledJob -Name querydriver | Disable-scheduledjob
以上为大家简单讲了下任务计划来龙去脉,以及最新2012开始对于Powershell管理的支持,下面我们切入主题,群集编排任务计划
也是在2012动态数据中心时代新增进来的功能,虽然我们有了通过powershell管理任务计划的功能,但是这只能在单台机器执行,如果是一个大规模群集的话,需要将任务计划复制到其它节点才可以,如果节点过多也过于麻烦,通过群集编排任务计划,提供了三种在群集内编排任务计划的方法
任何节点:将任务计划注册到群集中,执行程序放在群集共享磁盘,当到达触发条件时会在任意1个节点上执行任务计划,适用于对于群集审核日志,报告收集,应用程序预热等需求,我不需要在每个节点上面执行,只要有一个节点执行了就好,如果上次执行的节点宕机,下次会挑选其它的正常节点执行。
资源特定:将任务计划注册到群集中,执行程序放在群集共享磁盘,当到达触发条件时,自动针对于群集的指定资源执行,该类型任务计划与群集资源绑定,资源迁移到那个节点,任务计划就在那个节点执行,如果资源被删除,则任务也被删除,适用于针对群集磁盘执行碎片整理操作,默认情况下对于CSV,永远不会执行磁盘整理操作,如果您在CSV上面存放了大量动态VHDX,建议您创建一个此类型的编排任务,定期自动执行磁盘整理,将帮助CSV提升性能。
群集范围:将任务计划注册到群集中,执行程序放在群集共享磁盘,当到达触发条件时,任务计划程序将在所有有效的群集节点上执行,例如如果您希望在登录到任何节点时要打开一个或一组工具,则可以将这种任务添加为群集范围任务
群集编排任务从2012开始引入至今,目前还是只能通过powershell方式管理,所有群集编排任务的管理命令如下
Get-ClusteredScheduledTask 查询集群任务
Register-ClusteredScheduledTask 注册集群任务
Set-ClusteredScheduledTask 更新已经注册的集群任务
Unregister-ClusteredScheduledTask 取消注册群集任务
本例老王以创建一个资源特定类型的群集编排任务计划为例
1.创建编排操作
$action = New-ScheduledTaskAction - Execute C\ClusterStorage\Volume2\1.bat
内容如下,老王实作了CSV的碎片整理,由于属于群集磁盘,因此对于CSV执行磁盘整理命令前需置为重定向模式,整理结束后再行恢复
2.创建编排触发器,每周周五晚上十一点执行
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Friday -At "23:00"
3.将编排操作,编排触发器注册至群集编排任务
Register-ClusteredScheduledTask -Cluster hvclus -TaskName csvdefrag -TaskType ResourceSpecific -Resource "群集磁盘3"-Action $action -Trigger $trigger
TaskType其他类型参数:AnyNode ,ClusterWide,注册后不可变更编排任务类型
经过群集编排注册的任务计划会显示在任务计划程序-Windows -Failover Clustering文件夹中,此文件夹在未创建群集编排任务计划前处于隐藏状态,创建编排任务后显示,虽然UI界面也可以创建任务,但是UI界面创建的任务计划无群集编排效果,仅用作单机,当节点被群集逐出后,所有该文件夹的任务都将被删除
创建完成群集编排任务后,可以看到,资源特定类型的编排任务仅在资源所有者节点为准备就绪状态,其它节点上也会显示群集编排任务,但为禁用状态
移动资源至12HV02后,群集编排任务计划在12HV01上面禁用,12HV02上面就绪
任意节点类型编排任务,将随机在一个节点上面就绪,如果该节点宕机,则寻找其它正常节点就绪
群集范围类型编排任务,将在所有节点上面就绪,达到触发器条件时,所有节点一起执行,如果节点从群集被逐出,则编排任务将自动删除
老王这里把群集编排任务计划的操作程序放在群集共享磁盘中,是处于高可用考虑,您也可以尝试把操作程序放在所有节点本地磁盘相同位置
查询群集内所有编排任务计划
Get-ClusteredScheduledTask -Cluster hvclus
查询群集内特定资源类型编排任务计划
Get-ClusteredScheduledTask -Cluster hvclus -TaskType ResourceSpecific
查询群集内特定名称的编排任务计划
Get-ClusteredScheduledTask -Cluster hvclus -TaskName csvdefrag
更新群集编排任务计划
变更触发器条件
$trigger = New-ScheduledTaskTrigger -At 22:00 -Daily
更新编排任务计划
Set-ClusteredScheduledTask -Cluster hvclus-TaskName csvdefrag -Trigger $trigger
查询编排任务计划触发器条件
(Get-ClusteredScheduledTask -TaskName csvdefrag).TaskDefinition.Triggers
取消注册群集编排任务计划,取消后任务将从各节点删除
Unregister-ClusteredScheduledTask -Cluster hvclus -TaskName csvdefrag