编写 Compute Cluster Server 脚本 - 概述

发布者 Microsoft 脚本专家

如果您正在寻求 Microsoft® Windows® Compute Cluster Server 2003 的自动化管理方法,您就来对地方了。Microsoft 脚本专家一直坚持这样一个见解,那就是,在 GUI 里能实现的任何事情,通过命令行也应能够实现。如果您发现自己多次输入相同的命令,您就应该将其写成脚本。(本文章还包含指向英文网页的链接。)

“脚本专家”并不是完全无能的(尽管有一些人可能会为此争吵不休)。我们设想许多向您那样运行高性能计算中心的人们可能会暗自想:“Windows 脚本 - 那难道不是很矛盾吗?我想您可能只是通过 GUI 来管理 Windows。”我们希望在这里呈现的以及脚本中心中其余的文章和脚本能使您重新思考您的判断。

当我们将 Compute Cluster Server 用于测试运行时,我们欣喜地发现其拥有 dual-carburetor 命令行接口以及 high-octane 脚本库。没有这些,您就不得不加速运转引擎来管理一个有着大量并行 gigaflop 运算的 100 x64 机器的计算群集。我们也发现许多其他种类的 Windows 系统管理脚本功能可以非常方便地用于管理 Compute Cluster Server。

Scripto 博士:"我认为 gigaflop 类似于 Microsoft Bob。"

Compute Cluster Server 脚本编写页面上,您将找到指向文章、脚本示例和其他资源的链接。该页面展示了 Compute Cluster Server 脚本编写的全景。继续阅读其他关于 Compute Cluster Server 的文章和示例脚本,找到您需要了解的特定区域,以便能够编写 Compute Cluster Server 脚本。

如果到目前为止您还没有阅读为 IT 人员准备的 Compute Cluster Server 的主要文档,从有关Windows Cluster Server 2003 的高性能计算的介绍信息开始读起可能更有意义。我们不想重复太多:相反,我们会认为您已经了解了 Compute Cluster Server 的基础知识,并且您想要知道如何用脚本对其进行管理。

本页内容

超越 GUI
您如何从命令行管理 Compute Cluster Server?
您如何在 Compute Cluster Server 上使用 Windows 脚本?
Compute Cluster Server 的脚本编写有什么新功能?

超越 GUI

让我们猜想一下:您可能已经找到了有关运行计算群集的图形工具的文档(如果没有,尝试查找 Windows Compute Cluster Server 2003 技术库)。并且您曾超越自己、兴奋不已,对吗?不是吗?嗯,脚本专家已从可靠消息来源收到了这样一条信息:使用脚本从命令行进行管理是许多高性能计算设备的标准。不要误解我们:GUI 工具在许多情况下表现良好。但是对于基于控制台的情况,Compute Cluster Server 提供一个命令行接口 (CLI),此接口带有在命令提示处提供交互性的五个工具。COM automation API 使 Compute Cluster Server 可以访问 Windows 脚本语言以及系统级编程语言。其他 Windows 脚本技术可帮助在计算群集管理的许多领域中实现自动化。

当您将命令行工具与有效的脚本策略结合时,您可保持高性能的计算安装高度可用,降低管理开销和提高效率。编写脚本可使您自动化和标准化重复或复杂的任务,减少管理错误以及将最佳操作编码。通过脚本,您也可以自定义记录过程,以所喜欢的格式生成特定的信息,这可以为审核提供方便。我们在此可能要劝告您改变观念,但是可能您不知道这也可应用于 Windows。

不,与常见的误解相反,脚本专家工作不会收取佣金。Compute Cluster Server 和 Windows 的所有这些方便功能均免费赠送。

您如何从命令行管理 Compute Cluster Server?

如果您不得不一次性快速地配置节点或是查找工作的问题,面对这种情况:您可能不会坐下来编写一个脚本。您更可能会依赖所信任的外壳程序,然后使用易于得到的任何命令行工具来应付这项任务。让我们再来猜想一下:您是那种确实打字很快的人,对吧?假设如此。

我们想让您知道:Compute Cluster Server 提供其自己的命令行工具,而 Windows 可提供的更多。考虑到您在求助于脚本前可能会首先尝试 Compute Cluster Server 工具,所以我们在此将提及这一工具。但是对于细节内容,在此部分中我们仅会向您介绍一些其他资源,因为这篇文章的重点在于利用 VBScript、Windows Script Host (WSH) 和 Windows 脚本库来编写脚本。

当您安装 Compute Cluster Server 时,您将获得可与计算群集节点、工作和任务共同工作的命令行工具。这些工具可使您在命令提示处虚拟执行任何可在 GUI 内执行的任务。这些工具的开发人员通过深思熟虑将其写入 VBScript,因此您可以研究代码来学习其工作方式。浏览这些工具的代码能启发您编写 Compute Cluster Server 脚本的方法,如果需要,您可以对其进行自定义或扩展。当然,您也可以在批处理文件和 WSH 脚本中使用这些工具。

工具

功能

job

用于创建、提交、查看和管理作业。

task

用于查看、取消和重新排队任务

node

用于添加、删除和管理作业节点。

cluscfg

能够监视和操作队列。

clusrun

在多个节点上运行任何命令或脚本,重新定向对客户节点的输出。

想要了解工具语法的详细信息,请在节点的命令提示处运行“工具名称/?”或参阅Compute Cluster Server Command Line Interface Reference(英文)。

命令行管理的其他资源

Using Microsoft Message Passing Interface(英文)
Microsoft Message Passing Interface (MS MPI) 是 Compute Cluster Server 的组件,支持在多个并行处理中运行单个任务。Microsoft MPI 基于 MPICH2,一种源于 Argonne National Laboratory 的免费而简便的 MPI 工具。另一个 Compute Cluster Server 命令行工具是 Mpiexec.exe,可使您通过命令行使用 MPI。关于语法的详细信息,请在节点的命令提示处键入 mpiexec。使用 MPI 的应用程序包含对于特殊 MPI 例程的调用并且必须在 Mpiexec.exe 可执行程序内运行。

How to Perform User Operations(英文)
参考 Windows Compute Cluster Server 2003 Technical Library 有关如何使用 RCE 和 Microsoft MPI 的实践建议部分。绝大多数主题说明了可与 GUI 程序共同执行给定操作的命令行。

Use Batch and Script Files(英文)
Windows Compute Cluster Server 2003 Technical Library 中的这一主题提供从其他平台向 Compute Cluster Server 输送批处理文件的说明。

Deploying and Managing Microsoft Windows Compute Cluster Server 2003(英文)
Windows Compute Cluster Server 2003 Technical Library 中的这一主题提供自动部署 Compute Cluster Server 一系列方法(包括命令行方法)的信息。

如果您到这来是为了寻找关于 Microsoft Bob 的脚本信息,很抱歉,我们没有任何信息。

Scripto 博士:"Microsoft Bob 脚本编写 API 是个迷中之迷 ... 或者曾是一个迷中之迷?"

您如何在 Compute Cluster Server 上使用 Windows 脚本?

好的,您已经测试运行了命令行工具 - 嗨,看那,您的键盘正在高速运行!但是现在您发现您会遇到一些复杂情况,那些您知道将来必须常做的重复任务。也许您想要从文件中删除信息,或是配置大量的机器。您可能比以往输入得更快,但您的键盘恐怕就要着火了。您也许开始将命令加入到批处理文件中,对于几个命令那可能还很奏效。但在 Windows 中,有许多其他类型的脚本,与批处理文件相比,其功能更强大而且也不难学。

我们在“脚本中心”教授和练习的那种脚本出现在 Windows Script Host (WSH) 脚本编写环境下。大多数 Windows 上的系统管理脚本使用 WSH 命令行脚本宿主 Cscript.exe,尽管图形宿主 Wscript.exe 仍然可用。

为了编写在这些环境下运行的脚本,您可使用任何可兼容 WSH 的语言。Windows 随附 VBScript 和 JScript 的脚本引擎和其他语言的引擎包括 Perl、Python 和 REXX,可通过免费下载得到(请参阅资源列表)。VBScript 是 Windows 系统管理员中最受欢迎的脚本编写语言,因而其为“脚本中心”的大多数示例所使用的语言。

我们尽量使脚本努力工作,这样我们就可以轻松些,为此,我们的脚本使用基于 Component Object Model (COM)(一个能使不同的应用程序交互的 Windows 编程标准)的脚本库。我们使用的两个最重要的 COM 脚本库是:

  • Windows Management Instrumentation (WMI)(英文),其涵盖了 Windows 操作系统的绝大多数功能,以及许多其他相关领域(例如 Exchange Server)的功能。WMI 提供可使您管理多个宿主的远程功能。

  • Active Directory Service Interfaces (ADSI)(英文),其展示了脚本的目录服务,包括 Active Directory 和 Windows Security Accounts Manager。您可使用 ADSI 来管理本地及域用户和组。

如果您不熟悉 Windows 脚本编写基础,一个入门的好去处是 Windows 2000 Scripting Guide(英文)。此脚本编写指南包括从学习 VBScript 到在企业中编写脚本的广泛的 Windows 系统管理脚本编写知识。另外一个重要的资源是脚本库,一个用几种脚本语言编写的几千个系统管理脚本样例的集合。

一个真正的代码示例要用一千字(我们希望我们能说服老板以此为基础付给我们报酬)。因此以下是一个简单的样例,其包含一些您可能需要的计算群集头节点的信息。根据配置的不同,您可能需要在计算群集头节点上安装一个或两个特殊的修补程序。脚本检查其中一个修补程序是否已经安装了。我们现在不打算对其进行详细解释,但是您应该了解我们所讨论的脚本种类。

strHotFix = "KB897616"
Set objWMIService = GetObject("winmgmts:")
Set colItems = objWMIService.ExecQuery("SELECT * FROM " & _
 "Win32_QuickFixEngineering WHERE HotFixID = '" & strHotFix & "'")
WScript.Echo "Hot Fix " & strHotFix
If colItems.Count > 0 Then
  For Each objItem In colItems
    WScript.Echo "  Description: " & objItem.Description
    WScript.Echo "  Installed By: " & objItem.InstalledBy
    WScript.Echo "  Installed On: " & objItem.InstalledOn
  Next
Else
  WScript.Echo "  Not found"
End If

怎么样,是不是您的肾上腺素升高了?这个程序使用 VBScript 编写,并且运行在 WSH 命令行脚本编写环境 (Cscript.exe) 中。如果您想要尝试一下,就复制代码并将其粘贴到文本文件内。以扩展名 .vbs 来重新命名文本文件 - 让我们称其为 Hotfix.vbs。

为了运行脚本,运行 Cmd.exe 打开一个命令提示窗口。在命令提示处键入:

cscript hotfix.vbs

如果您默认的脚本宿主已经设置为 Cscript.exe,在脚本名之前不需要加 cscript。为此(去掉两行徽标并保存为默认值),运行:

cscript //h:cscript //nologo //s

如果在没有安装修补程序 KB897616 的框内运行 Hotfix.vbs,将返回以下结果:

C:\scripts\CCS>hotfix.vbs
Hot Fix KB897616
  Not found

现在试着将分配给 strHotFix 的值更改为 KB913446。如果该修补程序已安装在您的机器内,您现在可获得:

C:\scripts>hotfix.vbs
Hot Fix KB913446
  Description: Security Update for Windows XP (KB913446)
  Installed By: SYSTEM
  Installed On: 2/16/2006

Scripto 博士:"这难道不令人吃惊吗?就连 Microsoft Bob 都无法那样地管理补丁。"

Scripto 博士有时会控制失灵,但如果您需要使用补丁,以下脚本会有用。它使用 WMI 类 (Win32_QuickFixEngineering),以进入 Windows 的内部并提取信息。我们知道,我们知道,令人费解的名字。他们难道不能用诸如“HotFix”这样简单的名称对其命名吗?是的,他们可能并也许应该这样做。但是 WMI 并不是只为脚本编写者而设计的;它也是为使用系统级(诸如 C++)语言的开发人员设计的,他们可能会对“HotFix”这样显而易见的名字哄堂大笑。我们不知道是谁命名了 WMI 的名称空间和类,但是我们认为他们可能是以世界语为母语的人。

好消息就是一旦掌握了一些可以随心所欲做事的类,你就可以轻易地将其加入到与之相似的系统管理脚本中去。利用这些脚本,您可以自动部署、配置和操作 Compute Cluster Server 相关的大量复杂和重复任务。这不仅消除了蠢笨的工作,而且通过将这些操作编写为脚本,您可以有效地记录标准操作程序。这样一来,当您休假时,您的操作程序并不会休假。

现有的 Windows 脚本库有许多运行 Compute Cluster Server 安装的其他用途。正如同您已知的那样,Compute Cluster Server 头节点和计算节点可连接到五个不同的公共和私人网络的拓扑上(请参阅 Deploying and Managing Microsoft Windows Compute Cluster Server 2003(英文))。为了帮您解决这个复杂的任务,WMI 提供了类,能使脚本配置、控制和监视 Compute Cluster Server 节点间的网络以及遍及全部拓扑的外部网络的网络。

Compute Cluster Server 安装在节点上运行的几个 Windows 服务 - 您不知道吗 - WMI 提供管理这些服务的脚本编写功能。为监视事件日志以及 Compute Cluster Server 相关事件,您也可使用几个不同的 WMI 类。

由于每个群集节点必须是 Active Directory 域的成员,Compute Cluster Server 使用 Active Directory 来对其用户进行授权及验证。脚本可使用 ADSI 来自动管理 Active Directory 和本地 Security Accounts Manager 中的用户和组。

当新节点安装到计算群集上时,您不得不执行其他任务,也可对其编写脚本。例如,您将需要激活 Windows 操作系统和 Internet 连接以及配置新节点上的网络设置。WMI 级类也可帮助实现令人烦倦工作的自动化。

Compute Cluster Server 的脚本编写有什么新功能?

目前我们一直在使用推出很久的脚本编写功能。但是 Compute Cluster Server 在 WMI 和 ADSI 中添加了新功能。当您安装 Compute Cluster Server 时,您也可以完全免费获得崭新的 COM automation API,其可使脚本访问 Compute Cluster Server 作业调度程序(您可使用它来管理计算群集的众多方面)。使用 WMI 和 ADSI,您可用任意兼容 WSH 的脚本编写语言在 WSH 环境下为 Compute Cluster Server 库编辑脚本。我们就此向您承诺!

Compute Cluster Server 脚本的最出众之处在于 Ccpapi.dll 中包含的新 COM 自动库。极具特色的 API 为涵盖整个计算群集及作业调度程序(包括群集、节点、作业和任务)的脚本和应用程序提供对象模型。通过使用 API 编写脚本,您可以自动运行使用 GUI 或命令行工具可执行的任何任务。一些事物的名称(例如类和属性)是超乎寻常地符合逻辑且简洁明了。他们刚才在想什么呢?

如果您想直接深入了解 Compute Cluster Server API 的详细信息,请查询 Microsoft Developers Network 上的 Microsoft Compute Cluster Pack SDK。SDK 提供了 COM 界面的参考,但是它更面向于 C++ 程序员而不是脚本编辑者。

如果您想用您的脚本测试运行此虚拟蓝博基尼,我们有一句忠告:

Microsoft.ComputeCluster.Compute

对不起,我们将量加大了。让我们再试一次:
Microsoft.ComputeCluster.Compute

如果在满月时,您的群集上对其重复了十次,Scripto 博士会说您的处理器速度会加倍。但是即使不是满月,您也可在脚本中使用它:它是您所需的程序标识符 (progID),可以调用 Compute Cluster Server 脚本 API 的隐秘力量。请将其用于善事而不是恶事。

让我们假设您想要了解群集节点的属性。您可使用如下脚本:

strNode = "testlab12"
Set objComputeCluster = CreateObject("Microsoft.ComputeCluster.Cluster")
objComputeCluster.Connect("localhost")
WScript.Echo "Compute Cluster Name: " & objComputeCluster.Name
Set colNodes = objComputeCluster.ComputeNodes
For Each objNode In colNodes
  If LCase(strNode) = LCase(objNode.Name) Then
    WScript.Echo "Compute Node Name: " & objNode.Name
    WScript.Echo "  Number of Processors: " & objNode.NumberOfProcessors
    WScript.Echo "  Processor Architecture: " & objNode.ProcessorArchitecture
    WScript.Echo "  Processor Speed: " & objNode.ProcessorSpeed & " MHz"
    WScript.Echo "  Memory: " & objNode.Memory & " MB"
    WScript.Echo "  Status: " & objNode.Status
    WScript.Quit
  End If
Next
WScript.Echo strNode & " not found."

如果 testlab12 在计算群集内在线,您可获得以下行输出:

C:\scripts>ccs-list-node-simple.vbs
Compute Cluster Name: TESTLAB
Compute Node Name: TESTLAB12
  Number of Processors: 2
  Processor Architecture: AMD64
  Processor Speed: 2192 MHz
  Memory: 2047 MB
  Status: 0

如果不是:

C:\scripts>nodeproperties.vbs
Compute Cluster Name: TESTLAB
testlab12 not found.

您想要知道“Status: 0”的含义?它对您有多重要?好的,好的,这意味着节点状态是 Ready。为什么不能这样直接表示呢?嗯,Status 属性使用一列映射到整数值的的常量。遗憾的是您不能用脚本直接获得字符串值。但是如果您想要弄明白脚本是如何处理该属性和输出解释性字符串的,请参阅脚本存储库中的 Get Nodes Properties(英文)脚本。

什么,您要我们解释发生了什么?一些人的苛刻是让人难以置信的。正如一个明智的老杂耍演员告诉我的那样,“别理那些不知满足的人”。

别担心,我们不会真的不理您的。很快回来进入详细解释用脚本自动执行主要任务的文章《A Tour of Scripting Functionality for Compute Cluster Server》(Compute Cluster Server 脚本编写功能漫游)。您也可浏览示例脚本,这些脚本能说明如何利用 Compute Cluster Server 脚本 API,以及其他有助于您管理 Compute Cluster Server 的标准脚本来实现 Compute Cluster Server 的自动化。

我们希望您将能够为您的计算群集写出大量的系统管理脚本。当您写出脚本时,请发送其中的示例给我们并告诉我们您遇到的问题。您可通过 Microsoft 脚本专家联系我们。

Scripto 博士:"提 Microsoft Bob 就是了。"