任务计划是操作系统中重要的组件,通过任务计划,电脑可以自动帮助我们在某条件下触发某操作,以完成任务


对应到现实生活类似于现在的智能电饭锅,你每天早上需要吃早餐,但是又不想做,就用智能电饭锅做了个定时操作,每天早上七点,用小火帮我煮好粥,到点起来吃就可以了,操作系统中的任务计划也是相通的概念,意义在于通过电脑自动帮助我们完成任务,不用每次亲力亲为


任务计划通常被用于操作系统或后端的应用程序,例如定期执行审核收集脚本,定期生成硬件报告,定期处理应用程序缓存,等等


高级电脑用户可以用任务计划,自动帮助我们执行某事,例如你知道今天下午三点要做某事,但是你三点有事不在,就可以做个任务计划,到时间电脑自动帮你完成

企业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文件夹

2018-02-07_091857.png


查看任务计划

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执行磁盘整理命令前需置为重定向模式,整理结束后再行恢复

2018-02-07_094829.png


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,注册后不可变更编排任务类型

2018-02-07_095441.png


经过群集编排注册的任务计划会显示在任务计划程序-Windows -Failover Clustering文件夹中,此文件夹在未创建群集编排任务计划前处于隐藏状态,创建编排任务后显示,虽然UI界面也可以创建任务,但是UI界面创建的任务计划无群集编排效果,仅用作单机,当节点被群集逐出后,所有该文件夹的任务都将被删除


2018-02-07_095511.png

创建完成群集编排任务后,可以看到,资源特定类型的编排任务仅在资源所有者节点为准备就绪状态,其它节点上也会显示群集编排任务,但为禁用状态

2018-02-07_095931.png


移动资源至12HV02后,群集编排任务计划在12HV01上面禁用,12HV02上面就绪


2018-02-07_100032.png


2018-02-07_100016.png


任意节点类型编排任务,将随机在一个节点上面就绪,如果该节点宕机,则寻找其它正常节点就绪

群集范围类型编排任务,将在所有节点上面就绪,达到触发器条件时,所有节点一起执行,如果节点从群集被逐出,则编排任务将自动删除


老王这里把群集编排任务计划的操作程序放在群集共享磁盘中,是处于高可用考虑,您也可以尝试把操作程序放在所有节点本地磁盘相同位置


查询群集内所有编排任务计划

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