В течение многих лет работы администратором серверов я всегда выполнял регистрацию на каждом рабочем сервере, чтобы собрать данные или внести изменения. Обычный способ сделать это на серверах Windows — использовать протокол RDP, обеспечивающий доступ к серверу через клавиатуру и монитор. К сожалению, у этого метода есть два недостатка: во-первых, только два человека могут подключиться через RDP к любому серверу, а, во-вторых, RDP использует много ресурсов, что может повлиять на производительность сервера.
В PowerShell 2.0 реализован иной способ управления серверами, именуемый удаленным взаимодействием. При удаленном взаимодействии используется упрощенный протокол WSMan, чтобы предоставить доступ, необходимый для выполнения работ на сервере, но без значительных требований к ресурсам, свойственных RDP. Благодаря удаленному взаимодействию снимается ограничение на регистрацию двух пользователей, и вам не приходится разыскивать сетевого администратора, чтобы он освободил сервер и дал выполнить работу.
PowerShell 2.0 совместим с Windows Server 2003 с пакетом обновления SP2 и более поздними версиями. Обратите внимание, что для использования удаленного взаимодействия с заданием агента SQL Server на SQL Server 2008 или SQL Server 2008 R2 необходимо задействовать тип задачи командной строки и запустить powershell.exe с указанием полного пути к вашему сценарию. Дело в том, что эти версии SQL Server, поддерживая тип задач PowerShell, используют sqlps.exe на основе PowerShell 1 для выполнения сценариев PowerShell, и эта версия не поддерживает удаленное взаимодействие. SQL Server 2012 и выше используют версию PowerShell, установленную на сервере.
На приведенном рисунке вы видите простую схему, где показаны компоненты, используемые при удаленном взаимодействии PowerShell.
Рисунок. Компоненты, реализующие удаленное управление |
Сеанс PowerShell устанавливает соединение с HTTP-прослушивателем на сервере через протокол WSMan. Этот прослушиватель направляет запрос к конечной точке PowerShell, обслуживающей удаленное взаимодействие, и сервер запускает процесс wsmprovhost.exe, который представляет собой PowerShell на удаленном сервере. Важно помнить, что каждый уникальный удаленный сеанс с сервером получает собственный экземпляр wsmprovhost, поэтому может существовать больше двух сеансов связи с сервером, но с ростом их числа увеличивается количество ресурсов, выделяемых сервером для этих процессов.
В Windows Server 2012 и Windows Server 2012 R2 удаленное взаимодействие предусмотрено изначально, и вам остается лишь начать использовать его. Пользователям предыдущих серверных версий Windows необходимо подготовить сервер для удаленного взаимодействия с помощью команды Enable-PSRemoting. Если нужно подготовить для удаленного взаимодействия все серверы в домене, можно «Разрешить автоматическую настройку прослушивателей», выбрав Computer Configuration\Administrative Templates\Windows Components\Windows Remote Management (WinRM)\WinRM service.
После того, как удаленное взаимодействие будет разрешено, можно выполнить регистрацию в специальном сеансе на сервере с использованием команды Enter-PSSession. На данном этапе вы подключены к серверу таким же образом, как если бы выполнили прямую регистрацию на сервере. Это состояние продлится до тех пор, пока не будет выполнена команда Exit-PSSession (см. экран 1).
Экран 1. Команда Exit-PSSession |
Специальные сеансы подходят для быстро выполняемых задач, но процесс организации сеанса на сервере связан с серьезными затратами. Поэтому, если предстоит выполнить значительный объем работ на сервере, полезно организовать постоянный сеанс с помощью команды New-PSSession. Затем можно открывать и закрывать сеанс по мере необходимости, и созданные объекты будут существовать до тех пор, пока не будут уничтожены с помощью команды Remove-PSSession (см. экран 2).
Экран 2. Команда Remove-PSSession |
Благодаря интерактивным сеансам удается избежать затрат и ограничений, связанных с RDP, но преимущества удаленного взаимодействия будут еще более привлекательны, если использовать команду Invoke-Command для запуска задач на нескольких серверах. С помощью этой команды можно запускать один сценарий или набор сценариев на многих серверах. Я знаю администратора, который таким образом управляет тысячами серверов по всей стране. Кроме того, Invoke-Command обеспечивает одновременный запуск нужного числа таких команд. По умолчанию это число равно 32, но его можно изменить, указав аргумент -ThrottleLimit с другим значением.
Команда Invoke-Command принимает аргумент –ComputerName, чтобы получить список серверов, на которых можно запустить команду. Этот аргумент принимает единственное имя сервера, список имен серверов с разделителями-запятыми или объект с набором имен серверов. Вы указываете команду с помощью блока кода сценария после аргумента –ScriptBlock или задавая полный путь к запускаемому сценарию с использованием аргумента –filepath (см. экран 3).
Экран 3. Блок кода сценария после аргумента ScriptBlock |
После этого сценарии, подготовленные для сбора информации из SQL Server с использованием PowerShell, можно запускать на всех серверах одновременно. Собрать данные в таком случае удается гораздо быстрее, чем при запуске сценария на каждом сервере в отдельности. Результаты можно направить в переменную и проанализировать ее содержимое в поисках возможных проблем. В примере на экране 4 я искал любые базы данных со свойством AutoShrink, имеющим значение True.
Экран 4. Свойство AutoShrink имеет значение True |
Итак, удаленное взаимодействие обеспечивает удобный способ управления всеми серверами и возможность управлять всеми серверами одновременно. Надеюсь, этот метод будет вам так же полезен, как и мне.