Управление несколькими серверами для Hyper-V (часть 3)

Опубликовано: 20 Апреля, 2023

  • Управление несколькими серверами для Hyper-V (часть 4)

Введение

В предыдущей статье этой серии я обсуждал два отдельных метода управления несколькими серверами. Сначала я показал вам, как создавать и использовать группы серверов в версии диспетчера серверов для Windows Server 2012. После этого я провел вас через процесс установления сеанса с удаленным сервером через PowerShell. Хотя обе эти техники управления работают хорошо, ни одна из них не является столь мощной, как методика, которую я собираюсь продемонстрировать в этой заключительной статье серии.

Вызов команды

PowerShell позволяет использовать командлет Invoke-Command для выполнения команды на одном или нескольких удаленных компьютерах. Чтобы показать вам, как работает этот процесс, я хочу вернуться к другой команде, которую я обсуждал ранее в этой серии. Как вы помните, команда Get-VM используется для получения имен всех виртуальных машин, работающих на определенном хосте Hyper-V. Для демонстрации предположим, что нам нужно создать список всех имен виртуальных машин вместе с именем хост-сервера, на котором находится виртуальная машина, состоянием виртуальной машины и ее рабочим статусом. Мы можем сделать это с помощью следующей команды:

Вы можете увидеть, как выглядит результат на рисунке A.

Изображение 15509
Рисунок A: Вы можете использовать командлет Get-VM для получения информации о виртуальной машине.

Теперь, когда я продемонстрировал полезную команду PowerShell, давайте сделаем ее еще более полезной, направив команду для запуска на нескольких хостах Hyper-V. Для этого воспользуемся командлетом Invoke-Command.

Когда вы используете командлет Invoke-Command, вы должны указать имена компьютеров, на которых вы хотите запустить команду (через параметр ComputerName), и, конечно же, вы должны указать команду, которую хотите запустить. Чтобы показать вам, как это работает, предположим, что я хочу запустить показанную ранее команду Get-VM на двух разных хостах Hyper-V. В этом примере я буду использовать сервер с именем Lab2 и сервер с именем Prod2. Фактическая команда, которую я бы использовал:

Обратите внимание, что в приведенной выше команде задание командлета Invoke-Command заключается просто в перенаправлении команды на удаленные серверы, указанные параметром ComputerName. Фактическая команда, которая должна быть запущена на удаленных хостах, должна быть заключена в фигурные скобки {}. Вы можете увидеть вывод этой команды на рисунке B.

Изображение 15510
Рисунок B. Командлет Invoke-Command можно использовать для перенаправления команды PowerShell для выполнения на одном или нескольких удаленных серверах.

Как вы можете видеть на рисунке выше, были возвращены два набора выходных данных, поскольку были указаны два отдельных хоста Hyper-V.

Прямо сейчас я уверен, что некоторые из вас задаются вопросом, есть ли способ объединить выходные данные этих команд, а не перечислять выходные данные для каждого хоста Hyper-V отдельно. Этого можно добиться, просто добавив параметр ComputerName к команде Get-VM. Вам не нужно включать команду Invoke-Computer. Фактическая команда, которую вы бы использовали:

Как видно на рисунке C, эта команда создает единый список виртуальных машин. Быстрая проверка поля ComputerName подтверждает, что эти виртуальные машины охватывают несколько хостов Hyper-V.

Изображение 15511
Рисунок C: Вы можете объединить результаты команды в одну таблицу.

Давай по-настоящему

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

Тем не менее, реальность ситуации такова, что эта техника может быть немного болезненной. В предыдущем примере я использовал два разных хоста Hyper-V, но во многих организациях хостов гораздо больше. В моей собственной организации у меня на самом деле шесть хост-серверов.

Даже перечисление вручную шести отдельных хостов Hyper-V не так уж плохо, но помните… Методы, которые я продемонстрировал, применялись к хост-серверам. Этот же метод также можно использовать для запуска команд PowerShell на виртуальных машинах. В одной организации могут быть сотни или даже тысячи виртуальных машин. Вы действительно не хотите вводить все эти имена виртуальных машин или имена хост-серверов каждый раз, когда хотите запустить массовую команду PowerShell. К счастью, вам не нужно. Вы можете создавать текстовые файлы, содержащие имена виртуальных машин или имена хост-серверов, а затем использовать эти текстовые файлы в качестве входных данных.

Работа с текстовыми файлами

Чтобы показать вам, как это работает, я создал текстовый файл с именем C:ScriptsVMs.txt. Этот текстовый файл содержит имена некоторых виртуальных машин. Имейте в виду, что вы можете проявить творческий подход, используя эти типы текстовых файлов. Например, вы можете создать текстовый файл, действующий как список виртуализированных контроллеров домена, или текстовый файл, содержащий имена виртуализированных серверов Exchange.

В любом случае разобрать текстовый файл несложно. Если вы просто хотите посмотреть, что находится в текстовом файле, вы можете сделать это с помощью командлета Get-Content и указать путь и имя текстового файла. Вы можете увидеть, как это выглядит на рисунке D.

Изображение 15512
Рисунок D: Вы можете использовать командлет Get-Content для отображения содержимого текстового файла.

Конечно, отображение содержимого текстового файла — это одно. Использование содержимого файла в команде — это нечто совершенно другое. К счастью, мы можем легко использовать командлет Get-Content для анализа списка имен компьютеров и использования их в другой команде.

Чтобы показать вам, как это работает, я создал еще один текстовый файл с именем VMHosts.txt. Я заполнил этот текстовый файл именами своих хостов Hyper-V. Теперь воспользуемся этим текстовым файлом для получения информации о виртуальных машинах, находящихся на каждом хосте. Фактическая команда, которую мы будем использовать:

Вы можете увидеть вывод этой команды на рисунке E.

Изображение 15513
Рисунок E: Информация о виртуальной машине отображается для хостов, перечисленных в текстовом файле.

Если вам интересно, каждая строка текстового файла назначается переменной по умолчанию с именем $_. Таким образом, $_ представляет имя хоста. Вот почему мы можем использовать командную строку, такую как Get-VM –ComputerName $_.

Вывод

Изначально я планировал завершить эту серию статей этой статьей. Однако есть еще одна хитрость, которую я хочу вам показать. В части 4 я хочу показать вам, как можно автоматизировать создание текстовых файлов со списком виртуальных машин или хост-серверов. Существует ряд различных критериев фильтрации, которые можно использовать для составления выборочного списка машин, а затем записи этого списка в специальный текстовый файл. Например, вы можете использовать команду PowerShell для создания текстового файла, содержащего список виртуализированных контроллеров домена.

  • Управление несколькими серверами для Hyper-V (часть 4)