PowerShell — Автоматизация установки обновлений (скрипт)

Всем привет! Часто ли вы как администратор сталкиваетесь с установкой обновлений на операбельные части вашего промышленного программного комплекса? Если да, то эта статья для вас! В ней я представлю свои собственные наработки по автоматизации установки обновлений, которые не требуют «суперпупергипер» крутых знаний данного языка. Поехали!!!

PowerShell — Автоматизация установки обновлений (скрипт)

PowerShell как предмет для изучения

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

Разбираем скрипт

Итак, давайте начинать, я буду разбивать скрипт на блоки и объяснять, что он из себя представляет, и за что отвечает каждая строка, таким образом вы сможете понять как работает скрипт, а может даже узнаете, что то новое для себя. Внимание! В этой статье будет представлена первая версия скрипта, вторую версию я пока дописываю, но обязательно про нее расскажу позднее. Поехали.

С самого начала у меня есть строка:

Она означает, что я добавляю тип используемых библиотек Vusial Basic для выполнения скрипта, таким образом я могу использовать функционал Visual Basic-a в моем скрипте.

Далее необходимо с чего-то начать, а начать я решил с того, что буду удалять старые файлы обновления из временной папки и закачивать в нее новые, соответственно мне необходимо указать учетные данные, чтобы авторизоваться на 10-ти серверах, но предварительно мне эти 10 серверов нужно откуда-то получить, а получать я их буду из файла вот этой строкой:

Далее мне нужно получить учетные данные, но я хотел чтобы они вводились всего один раз и использовались на протяжении всего обновления. К тому же я хочу, чтобы мне выводилась подсказка о том, какую учетную запись мне ввести:

Плюс ко всему для удобства, мне необходимо выводить лог работы, т.к. я хочу видеть, на каком этапе находится мое обновление, для этого я добавил следующую строку:

Сразу после этого я начинаю проводить операцию, о которой только что сообщил:

Этими строчками скрипт удалил все содержимое папки C:\update и написал на каком сервере он провел данную операцию. Теперь можно переходить к загрузке файлов обновления. Так как разработчики, работающие в нашей компании присылают ссылку на скачивание обновления, я поступил следующим образом:

Соответственно далее хочу видеть лог:

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

Параметр -force использую для того, чтобы избежать подтверждения обновления и параметр -Recurse для удаления всех дочерних и вложенных элементов. После этого копирую и вывожу на экран полученные файлы, после чего вывожу на экран подтверждение загрузки:

После этого я подумал, что было бы не плохо заранее загрузить дистрибутив полученной сборки на нужные мне сервера, но мне нужен был выбор, например если обновление специфичное и требует каких-то дополнительных манипуляций, надо ли мне загружать его на все сервера или нет, поэтому я решил вывести форму Yes,No используя Visual Basic:

Соответственно, если я выберу «Yes», то выполнятся действия указанные в фигурных {} скобках. Теперь начинается самое интересное…

PowerShell — Выбор обновляемого элемента (switch)

Так как на серверах находится много элементов, которые могут быть обновлены, я сделал выбор обновляемых элементов и реализовал форму выбора через Visual Basic, записывая вводимое администратором значения в переменную, т.к. switch включает определенные функции по совпадениям в переменной:

Таким образом мы сможем обновлять конкретный элемент в зависимости от присланного обновления. Далее начинаем работать с самим switch-ем:

Здесь мы определяем, что под цифрой «1» (если именно она указана в переменной) следуют следующие строки:

Первый шаг простой, остановка службы, но нам нужно определить какой экземпляр останавливать, используем в коде фильтр пути:

Получаем службы с названием MonitorService после чего задаем фильтр пути $_.Path -eq ‘D:\MonitorService\MonitorService.exe’, таким образом остановится процесс, который запущен по этому пути. Далее пишем лог работы и следующий шаг:

Бэкап это вообще отдельная и сложная тема, но давайте по порядку.
Получаем дату строкой:

Т.к. на обновляемых серверах старая серверная ОСь необходимо загрузить на нее библиотеки сжатия System.IO.Compression.FileSystem.dll и указать добавление типа:

После этого создаем рабочую структуру для создания резервной копии:

Далее удаляем предыдущий бэкап для экономии места:

И пишем об этом лог на каком сервере совершилось действие:

Далее тестируем доступность пути из переменной $destFolder и удаляем его содержимое:

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

Потом получим все файлы, в том числе и вложенные, которые удовлетворяют нашим условиям, и скопируем их в путь указанный в переменной $dest с названием новой папки из переменной $sourse:

Дальше необходимо указать имя файла, но я хотел, чтобы он был с названием обновляемого элемента + сегодняшняя дата и соответственно формат резервной копии .zip. Выглядит это так:

И сжимаем:

Проверку создания бэкапа я реализовал в следующей версии скрипта, которую опишу в следующей статье, поэтому здесь после проделанных powershell-ом операций я просто пишу лог:

После этого я просто копирую файлы с локального сервера на все обновляемые сервера:

И последнее что нам осталось это обратно запустить приложение и сделать об этом запись:

На этом все! Самая простая и первая версия автоматизации установки обновлений через PowerShell! Ниже представлено видео с первым боевым тестированием 🙂

Не забывайте про наш канал!

Лицензионное соглашение

Авторские права публикуемых материалов полностью или частично принадлежат авторам сайта Pechenek.NET в соответствии со статьями 1252 и 1301 ГК РФ. Любое распространение должно быть согласовано с автором материала или с указанием ссылки на первоисточник.