Заметки о Windows и других программных продуктах Microsoft...

PowerShell 3.0. Обзор новых возможностей (часть 2)

PowerShell 3.0. Обзор новых возможностей (часть 2)

Продолжаем тему нововведений в PowerShell 3.0. В первой части мы рассмотрели общие изменения, в основном касающиеся удобства работы. Сегодня мы коснемся технологий, предназначенных для автоматизации и удаленной работы, в том числе через Web.

Sheduled Jobs

Для начала вспомним, что из себя представляют эти самые Jobs. Фоновые задания (Jobs) появились еще во втором PowerShell. Они дают возможность выполнить команду «в фоновом режиме», без взаимодействия с текущим сеансом пользователя. Это довольно удобно, ведь пока задание выполняется в фоне, можно продолжать работу в текущем сеансе, не дожидаясь его завершения.

Для примера запустим фоновое задание с именем Hello, которое выводит приветствие текущему пользователю:

Start-Job -Name Hello {Write-Output ″Hello,$env:username″}

Командлет Start-Job откроет дочерний процесс PowerShell, выведет в нем приветствие и закроет процесс. Правда результат мы не увидим, для его получения придется воспользоваться командой:

Get-Job -Name Hello | Receive-Job

Эта команда возьмет Job по имени Hello и выдаст результат его работы.

запуск Start-Job

 

В PowerShell 3.0 появилась возможность планировать выполнение фоновых задач прямо из консоли. К примеру я хочу получить приветствие не сейчас, а в 4 часа дня. Создаю триггер:

$t = New-JobTrigger -Once -At 4pm

И регистрирую задание, которое запустится по этому триггеру:

Register-SheduledJob -Name Hello -ScriptBlock {Write-Output ″Hello,$env:username″} -Trigger $t

Теперь ровно в 4 часа дня задание Hello будет запущено.

запланированный запуск Start-Job

 

И чтобы в этом удостовериться, откроем Task Sheduler и в разделе PowerShell\SheduledJobs увидим наше задание.

запланированное задание PowerShell в планировщике Windows

 

Планировать выполнение задания можно как однократно, в определенное время, так и периодически (напр. каждый понедельник). Также запуск задания можно привязать к определенному событию в системе, например к загрузке или входу в компьютер.

 

Workflow

Windows PowerShell Workflow, или попросту рабочие процессы – нововведение, впервые появившееся в PowerShell 3.0. Workflow в PowerShell основаны на  Windows Workflow Foundation и предназначены для автоматизации сложных процессов, которые занимают много времени и выполняются в больших масштабах. Проще говоря, Workflow предназначен для надежного выполнения долгосрочных задач на множестве компьютеров.

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

В качестве примера возьмем все то же приветствие и немного его изменим. Эта команда выведет приветствие пользователю, подождет 10 минут и затем попрощается с ним:

Write-Output ″Hello,$env:username!″; sleep 600; Write-Output ″Good Bye!″

А теперь создадим рабочий процесс с именем Hello:

workflow Hello {Write-Output -InputObject ″Hello,$env:username!″; Start-Sleep -Seconds 600; Write-Output -InputObject ″Good Bye!″}

Что мы можем сделать с этим рабочим процессом? Можем использовать его как обычную функцию, вызвав по имени, а можем запустить как фоновое задание:

$j = Hello -AsJob

С помощью команды Suspend-Job приостановим выполнение задачи и посмотрим, что она успела сделать.

workflow в PowerShell

 

А теперь внимание, смертельный номер — мы закроем сессию. Обычный Job при этом должен погибнуть вместе с результатами своей работы. Проверим. Открываем новую сессию, делаем экспорт модуля PSWorkflow и смотрим текущие задания. Вот оно, наше задание, находится в состоянии Suspended. И мы можем продолжите его выполнение командой
Resume-Job с того места, где оно было остановлено.

продолжение работы workflow после перезапуска

 

Более того, можно просто закрыть сессию, не останавливая процесс, и даже пустить компьютер в перезагрузку, рабочий процесс все равно выживет и сможет продолжить работу. Таким образом, в сочетании с Sheduled Jobs мы получаем инструмент для автоматизации, надежный, мощный и гибко настраиваемый.

 

Устойчивые сессии

Удаленные сессии в PS 3.0 сделаны более устойчивыми к проблемам сети. При разрыве соединения PowerShell не закрывает сразу удаленную сессию, а в течение 4 минут пытается восстановить подключение.

автоматическое переподключение при прерванной сессии

 

Если в течение 4 минут подключение появится, то сессия будет восстановлена а запущенное в ней задание выполнено, в противном случае сессия будет разъеденена.

продолжение работы после восстановления соединения

 

Но это еще не все. При разъединении сессия не удаляется, а переводится в состояние disconnected, и к ней можно снова подключиться как с того же, так и с любого другого компьютера.

В качестве примера откроем удаленную сессию с именем Test на компьютере SRV3 и запустим в этой сессии команду, которая будет выводить все запущенные на компьютере процессы с интервалом в 1 минуту:

$S = New-PSSession -Name Test -ComputerName SRV3
Invoke-Command -Session $S {Get-Process | foreach {$_;sleep 60} -AsJob

После чего разорвем сессию командой Disconnect-Session. Теперь сессия Test находится в состоянии disconnected.

разъединение удаленной сессии

 

Заходим на другой компьютер, открываем консоль PowerShell, подключаемся к сессии Test:

Connect-PSSession -Name Test -ComputerName SRV3

И получаем результаты работы, запущенной в этой сессии:

Receive-PSSession -Name Test

Как видите, задание спокойно продолжает выполняться.

подключение к удаленной сессии с другого компьютера

 

Файлы конфигурации сессии

Как вы помните, в удаленной сессии пользовательское окружение определяется конфигурацией сеанса. С помощью файла конфигурации сессии это окружение можно очень гибко настраивать — определять собственные функции и переменные, импортировать модули, задавать видимые командлеты и многое другое. Есть даже возможность указать учетные данные пользователя, от имени которого будет запущена сессия.

Приведу простой пример. Итак, мы хотим чтобы в удаленном сеансе были доступны только командлеты для просмотра. Создаем новый файл конфигурации OnlyGet.pssc :

New-PSSessionConfigurationFile -VisibleCmdlets Get-* -Path C:\PS\OnlyGet.pssc

Файл создан и его даже можно открыть и посмотреть в обычном блокноте командой:

Invoke-Item -Path C:\PS\OnlyGet.pssc

создание файла конфигурации для удаленной сессии

 

Затем, используя созданный файл, регистрируем новую конфигурацию с именем GetOnly:

Register-PSSessionConfiguration -Name GetOnly -Path C:\PS\OnlyGet.pssc

Обратите внимание, что регистрация новой конфигурации или изменение существующей требуют повышенных привилегий.

регистрация конфигурации сессии с помощью файла конфигурации

 

Подключимся к удаленному компьютеру SRV3, используя новую конфигурацию и посмотрим текущее время и дату:

$S = New-PSSession -ComputerName SRV3 -ConfigurationName GetOnly
Invoke-Command -Session $S {Get-Date}

Команда выполнится успешно. А теперь попробуем изменить время, сдвинув его на 10 минут назад:

Invoke-Command -Session $S {Set-Date -Ajust -0:10:0}

И получим ошибку, поскольку в данной сессии видны только командлеты Get.

Откроем еще одну сессию на SRV3 с другой конфигурацией, в которой разрешены командлеты Set, и пробуем еще раз изменить время. На этот раз команда будет выполнена.

удаленная работа в ограниченной конфигурации сессии

 

Командлеты Web

Еще PowerShell 3.0 умеет обращаться к веб-сервисам напрямую, без посредников. Например, я могу обратится к главной странице своего блога и получить список ссылок:

$w = Invoke-WebRequest windowsnotes.ru
$w.links | fl innerText, href

обращение к Web-сервису с помощью Invoke-WebRequest

 

Или взять RSS фид и вывести из него названия статей и ссылки:

Invoke-RestMethod http://feeds/feedburner.com/windowsnotesru | fl Title, Link

обращение к Web-сервису с помощью Invoke-RestMethod

 

Web Access

И если уж речь зашла о Web, то упомяну о еще одной интересной возможности — PowerShell Web Access. С ее помощью можно подключаться к удаленным серверам и работать с PowerShell прямо в веб-браузере.  Поскольку я уже описывал эту технологию в статье PowerShell Web Access в Windows Server 2012 , не буду на ней останавливаться. Скажу лишь, что все, что требуется для работы с PowerShell Web Access — это любое устройство (телефон, планшет и т.п.), имеющее доступ в интернет и браузер с поддержкой JavaScript и включенными cookies.

PowerShell Web Access

 

На этом, пожалуй, закончу. Конечно, я описал далеко не все возможности PowerShell 3.0, так что в ближайшем будущем планирую вернуться к этой теме более подробно. Также о PowerShell 3.0 можно почитать (на английском) здесь http://technet.microsoft.com/en-us/library/hh857339.aspx и здесь http://technet.microsoft.com/en-us/library/hh847833.aspx.

 
 
Комментарии

Очень круто! Спасибо за статью.
А можно более подробней раскрыть тему Invoke-WebReqest?