Недавно мне пришлось запустить сценарий .cmd на кластере для определения размера его ресурса. Выполнение сценария в удаленном режиме заняло более двух часов и породило большой сетевой трафик, поэтому я принял решение запускать этот сценарий локально на каждом узле кластера.

Казалось бы, выполнение такого сценария могло бы потребовать тех же усилий, что и выполнение одного сценария на автономном сервере, но, как выяснилось, это не так. Существуют дополнительные шаги, которые приходится выполнять при планировании запуска сценария или другого процесса для выполнения на кластере. Поскольку есть вероятность отсутствия кластерного ресурса на другом кластерном узле, необходимо убедиться, что сценарий существует на всех узлах, на которых ресурса может не быть. Однако дополнительно требуется убедиться, что сценарий выполняется только на активном кластерном узле. Можно добиться выполнения обеих целей с помощью сценария FindClusterResource.vbs, показанного в листинге.

Сценарий FindClusterResource.vbs проверяет наличие ресурсного диска. Если ресурсный диск существует, выполняет первый сценарий SpaceReport.cmd. Если ресурсного диска не существует, сценарий FindClusterResource заканчивается и SpaceReport.cmd не выполняется. Поскольку кластерный ресурс может находиться только на одном узле в любой заданный момент времени, сценарий SpaceReport.cmd выполняется только на том узле, на котором размещается кластерный ресурс.

В листинге используется тест для определения условия существования носителя ресурса. В этом тесте сценарий FindClusterResource.vbs вызывает метод GetDrive объекта FileSystemObject, который является компонентом библиотек Microsoft Scripting Runtime Library в Windows Script Host (WSH).

Сценарий FindClusterResource.vbs

Метод GetDrive возвращает объект Drive для носителя с определенным адресом пути. Если носителя нет, выдается ошибка, которая характеризуется значением 0. Таким образом, после вызова GetDrive сценарий FindClusterResource.vbs проверяет равенство значения нулю. Если это значение есть (т. е. ресурсный носитель отсутствует), то сценарий FindClusterResource.vbs прекращает работу. Если нет (т. е. ресурсный носитель есть), то сценарий FindClusterResource.vbs использует метод Run объекта WshShell для запуска команды SpaceReport.cmd в качестве нового процесса на данном узле.

Для применения этого сценария его надо настроить в двух местах. Сначала замените в коде

TaskName1 = "C:ScriptsSpaceReportSpaceReport.cmd"

имя C:ScriptsSpaceReportSpaceReport.cmd путем к первому сценарию. Потом в

ResourceDrv = "X:"

замените X буквой ресурсного носителя.

После выполнения этих изменений поместите сценарий FindClusterResource.vbs и свой сценарий в ту же папку на каждом узле в этом кластере. Затем задействуйте планировщик заданий Task Scheduler для планирования сценария FindClusterResource.vbs. Когда сценарий FindClusterResource.vbs запускается, он будет выполнять первый сценарий, и не важно, где находится кластерный ресурс. Надо отметить, что, если обработка отказа происходит во время назначенного задания, первый сценарий не выполнится. Однако это маловероятно, так что для исправления ничего делать не понадобится.

Джим Тернер (jturnervbs@gmail.com) — системный администратор и разработчик приложений в компании Computer Sciensces Corporation