Deploying Compute Cluster Pack by Script

Yet another common scenario: you want to avoid using RIS and have other applications that deploy a "golden image" of the operating system. All you need is a programmatic way of installing compute cluster pack. Well, I use this script - for which I claim no credit. It was developed by Phil Pennington. I found his toolkit very useful, so here's a link to it: https://philpen.officeisp.net/CCS/Forms/AllItems.aspx

' **************************************************************************************

' CcpSetup.vbs

'

' This script may be used to remotely invoke the Compute Cluster Pack node setup in

' an unattended installation.  The target compute node will be configured with the

' Node Management and MPI services and will join the specified cluster automatically.

'

' Prerequisites:

' 1.  The compute node is already configured with an OS.

' 2.  The compute node is already a domain member.

' 3.  The head node is already configured.

' 4.  The compute node has the CCP setup files located in the c:\CCP subdirectory.

'

' Usage:

' 1.  Run this script from the head node according to the command line usage

'           specified herein. 

' 2.  An accompanying 'servers.txt' file may be in the same directory as this

'           script.  Modify 'servers.txt' to indicate the compute node names on which

'           to install the CCP. 

'       3.  Alternatively, target a single node using the /N command line argument.

'       4.  To ensure the script output prints to the command window execute the

'           following command which selects the default script host:

' c:\> cscript.exe //H:Cscript

'       5.  To debug this script: 

' c:\> wscript.exe //d //x ccpsetup.vbs [arguments]

'

'

' Questions/Comments/Inquiry: philpen@microsoft.com

' **************************************************************************************

On Error Resume Next

' **** INITIALIZATION ****

const strThisScript = "CcpSetup.vbs"

' **** MODIFY THE FOLLOWING.  THIS IS THE HOSTNAME OF YOUR CLUSTER HEAD-NODE ****

strHeadNode = "CHANGE_ME_PLEASE"

' **** MODIFY THE FOLLOWING.  THIS IS THE FILE CONTAINING TARGET SERVER NAMES ****

strTargetNodeListFile = "servers.txt"

'strCommand = "cmd.exe /c set > c:\TEST.TXT"

strCommand = "c:\CCP\setup.exe -unattend -autologoff -computenode:" & strHeadNode

If (err.number <> 0) Then

     ErrorExit "Script Initialization Failed" & vbCrLf & "Reason: " & Err.Description

Else

     Call Main

End If

'-------------------------------   Main   ---------------------------------------

Sub Main()

  On Error Resume Next

 

  if (WScript.Arguments.Count < 1) then

     SetupCcpUsingHostNamesFromFile()   ' NO ARGS - RUN USING DEFAULTS

  end if

 

  ndx = 0

  Do While (ndx < WScript.Arguments.Count)

  LoArg = LCase(WScript.Arguments(ndx))

 

  If (LoArg = "/?") Or (LoArg = "-?") Then        ' DISPLAY USAGE

  Usage()

ElseIf (LoArg = "/h") Or (LoArg = "-h") Then ' SET strHeadNode

ndx = ndx + 1

If (ndx < WScript.Arguments.Count) Then

strHeadNode = WScript.Arguments(ndx)

End If

ElseIf (LoArg = "/f") Or (LoArg = "-f") Then ' SET strTargetNodeListFile

ndx = ndx + 1

If (ndx < WScript.Arguments.Count) Then

strTargetNodeListFile = WScript.Arguments(ndx)

SetupCcpUsingHostNamesFromFile

End If

 

  ElseIf (LoArg = "/n") Or (LoArg = "-n") Then ' RUN ON SPECIFIC NODE ONLY

  ndx = ndx + 1

If (ndx < WScript.Arguments.Count) Then

RemoteCommandExecute WScript.Arguments(ndx), strCommand

End If

Else

Usage()

  End If

 

  ndx = ndx + 1

  Loop

 

If (err.number <> 0) Then

     WScript.StdErr.WriteLine "ERROR : " & strThisScript & " : Main" & vbCrLf & "Reason: " & Err.Description

     Wscript.Quit(1)

End If

Wscript.Quit()

End Sub     ' **** END MAIN

'-------------------------------sub routines---------------------------------------

Sub Usage()

   On Error Resume Next

   WScript.StdErr.WriteLine ""

   WScript.StdErr.WriteLine "USAGE:"

   WScript.StdErr.WriteLine "c:\> cscript.exe " & strThisScript & " [options] [/H HeadNodeName] [/N ComputeNodeName] [/F NodeListFileName]"

   WScript.StdErr.WriteLine ""

   WScript.StdErr.WriteLine "where"

   WScript.StdErr.WriteLine "    arguments:"

   WScript.StdErr.WriteLine "        /H HeadNodeName    - Host name of the cluster headnode"

   WScript.StdErr.WriteLine "        /F NodeListFileName    - Text file with target compute node names (1 per line)."

   WScript.StdErr.WriteLine "        /N ComputeNodeName   - Just run it against this node only."  

   WScript.StdErr.WriteLine ""

   WScript.StdErr.WriteLine "        Note:  If these arguments are not present, then the "

   WScript.StdErr.WriteLine "               values are assumed to be hard-coded in this script."

   WScript.StdErr.WriteLine "               Edit the default values within this script file."

   WScript.StdErr.WriteLine ""

   WScript.StdErr.WriteLine "    options:"

   WScript.StdErr.WriteLine "        /? - Display this usage message."

   WScript.StdErr.WriteLine ""

   WScript.Quit(1)

End Sub

Sub ErrorExit(strMessage)

  On Error Resume Next

if (strComp(strMessage,"") <> 0) Then

WScript.StdErr.WriteLine strMessage

End if

Wscript.Quit(1)

End Sub

Sub SetupCcpUsingHostNamesFromFile()

  On Error Resume Next

  Const ForReading = 1

 

  Set objFSO = CreateObject("Scripting.FileSystemObject")

  Set objTextFile = objFSO.OpenTextFile(strTargetNodeListFile, ForReading)

 

  strComputers = objTextFile.ReadAll

  objTextFile.Close 

  arrComputers = Split(strComputers, vbCrLf)

 

  For Each strComputer In arrComputers   

  RemoteCommandExecute strComputer, strCommand

  Next

End Sub

Sub RemoteCommandExecute(strComputer, strCommand)

   On Error Resume Next

   Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")

   errReturn = objWMIService.Create(strCommand, Null, Null, intProcessID)

 

   If (errReturn <> 0) then

  WScript.StdErr.WriteLine strComputer & " : Error : "  & strCommand

   Else

  WScript.StdErr.WriteLine strComputer & " : " & strCommand 

   End If

End Sub