пятница, 25 августа 2017 г.

Сам себе WSUS / SCCM, или история победы велосипеда

Задача простая: надо в автоматическом режиме устанавливать программы в домене Microsoft Windows, на клиенты под тем же Windows. То есть у нас есть exe-файл, надо его всем расставить. Желательно один раз настроить процедуру и забыть навсегда. А ещё бесплатно.
Для порядка и объективности пробежимся по альтернативным методам поддержания зоопарка программного обеспечения в офисе в актуальном состоянии: развернуть

1. Внутренние системы обновлений самих программ
Всё вроде бы и отлично, только мы (админское наше величество) ничего не контролируем, а интернет-канал постоянно забит.
2. Установка средствами домена Windows
Групповая политика -> установка программ. Отсутствие контроля, и нужны MSI. С MSI-ями-то и обезьяна сделает, потому как есть
3. WSUS
Windows Server Update Services, последняя версия 3.0 SP2. Вроде как и бесплатно, и автоматически, и наглядно, и API есть, и "надёжено". Но как всегда, дьявол в мелочах. Про "мелочи" (тормозной wuau клиент, пролезающие "критические" обновления microsoft с телеметрией и багами, постоянная морока при установке и прочая-прочая) можно почитать в интернете. А я лично, после многих лет сосуществования, от него отказываюсь. Ну его совсем с его глюками. К тому же, нашим задачам он не отвечает, но к нему есть
4. Local update publisher
http://www.localupdatepublisher.com. Отличное приложение от стороннего (не Microsoft) разработчика, спасибо ему и низкий поклон. Позволяет запихать во WSUS то, что мы хотим установить, к тому же через графический интерфейс. Минусы простые: требует собственно самого WSUS, самоподписанный сертификат в домене и всё те же MSI.
5. Easy deploy
http://andyamaya.com Графическая оболочка над известным psexec, который позволяет выполнять команды на удалённой машине. Минус простой: всё надо делать руками.
6. WPKG
https://wpkg.org . Как бы альтернатива WSUS/SCCM. Бесплатно и довольно функционально. На практике: дофига делать руками, да ещё в xml запихивать при полном отсутствии дружественного интерфейса. Нафиг-нафиг.
7. SCCM
System Center Configuration Manager от Microsoft . Всё вроде как мы хотим, даже поддерживает мобильнички. Минус простой: цена, нет, ЦЕНА. А старые редакции вообще купить нельзя.
8. Непрофильный софт
Похожим функционалом обладает, например, контрольная панель Антивируса Касперского . Но, опять же, надо покупать, ставить клиент. К тому же, мне лично не понравилась тяжеловесность ПО и его базы.


Короче говоря. Если офис небольшой, софта немного, то все эти мастодонты и левиафаны нам ни к чему. За мной, мой друг, я проведу тебя дорогой истины и велосипедостроения! Все наши проблемы можно решить в несколько строчек cmd.

Что нам нужно? По пунктам:
1. На всех компьютерах должны быть последние/стабильные версии ПО - одновременно и автоматически;
2. У ПО должны быть одинаковые настройки.
Этот пункт, вообще, больше задача групповых политик (GPO). Но есть нюансы: Google Chrome имеет родные расширения для GPO , а Mozilla Firefox - нет. Так что это мы тоже будем решать (и решим!).


Значит, для автоматизации шаги такие:
1. Проверяем, есть ли у нас новая версия ПО;
2. Проверяем, установлено ли на этот компьютер;
3. Устанавливаем штатными средствами самого ПО (обычно этот экзешник с ключом типа -silent)
4. Делаем запись: на этот компьютер установили.

Всё будем делать штатными средствами винды. Нам вполне хватит групповых политик и скриптов командной строки.

Поскольку у нас Windows и exe-инсталлеры, единой команды установки для всего ПО нет. Это нам не *nix с репозиториями. У всех разные ключи и опции, плюс иногда нужно подкинуть настройки.

Это первый шаг, который нужно сделать.

пример для Firefox
Например, для автоматической тихой установки Mozilla Firefox ESR нам нужны:
такой cmd / bat командный файл :
\\сетевой\путь\к\экзешнику\firefox_setup.exe /INI="\\сетевой\путь\к\экзешнику\firefox_custom_install_opts.ini"

copy \\сетевой\путь\к\экзешнику\firefox_def_conf.js "C:\Program Files\Mozilla Firefox\defaults\pref" /Y

copy \\сетевой\путь\к\экзешнику\firefox_custom_prefs.conf "C:\Program Files\Mozilla Firefox" /Y

В ini будет что-то вроде:
[Insta// Any comment. You must start the file with a comment!ll]
QuickLaunchShortcut=false
MaintenanceService=false
В firefox_def_conf.js будет ссылка на нашу конфигурацию:
// Any comment. You must start the file with a comment!
pref("general.config.filename", "firefox_custom_prefs.conf");
pref("general.config.obscure_value", 0);
А в firefox_custom_prefs.conf мы уже указываем, как всё должно быть настроено в нашем офисе:
// Disable updaterlockPref("app.update.enabled", false);// make absolutely sure it is really off
lockPref("app.update.auto", false);lockPref("app.update.mode", 0);lockPref("app.update.service.enabled", false);
// Disable Add-ons compatibility checkingclearPref("extensions.lastAppVersion");
// Don't show 'know your rights' on first runpref("browser.rights.3.shown", true);
Таким образом мы можем настроить почти любой софт.
Один раз придётся прочитать документацию и написать руками, зато потом забываем навсегда.
Избежать этого шага нельзя даже при использовании дорогих продуктов.

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

Соответственно, нам нужна сетевая папка, где будут лежать наши деплои. Внутри папки с инсталляторами. Один инсталлятор – одна папка – один установочный файл, так удобнее.

Общий управляющий установочный файл, который мы потом добавим в доменное GPO в автозагрузку, будет примерно такой:
net use T: \\наша\сетевая\папка\с\деплоем
setlocal enabledelayedexpansion
FOR /R "T:\" %%I IN (*_auto_deploy.*) DO ( call T:\cmd\check.cmd %%I)endlocalnet use T: /delete /Yes

Очень просто. Ищем установочные файлы внутри нашей папки деплоя. Когда нашли – запускаем проверку. Проверка такая:

Pushd %~dp1
SET /P TMPHASH=<hash.txt
SET EXEFLNM=tempr
SET FLNM=tempr2
for /R %%Z in (*.exe) DO (
    set EXEFLNM=%%~nxZ
    set FLNM=%%~nZ
)
CertUtil -hashfile %EXEFLNM% MD5 | findstr /C:"%TMPHASH%" /X
if %ERRORLEVEL%==1 GOTO HASHGEN
IF EXIST \\путь\к\папке\logs\%computername%_%FLNM%.log goto END
:INST
CALL %1 %EXEFLNM%
echo %FLNM% installed %date% %time:~0,5%>\\путь\к\папке\logs\%computername%_%FLNM%.log
:END
popd
goto :EOF
:HASHGEN
CertUtil -hashfile %EXEFLNM% MD5 | find /i /v "md5" | find /i /v "certutil">hash.txtdel \\путь\к\папке\logs\%computername%_%FLNM%.log
goto INST

Немного больше строк, но по факту всё просто. Для начала мы задаём рабочую директорию, в которой нашли установочный файл. Рядом, как мы помним, лежит экзешник-инсталлятор. Теперь узнаём, не новая ли версия ПО у нас появилась. Для этого мы сверяем хэш файла. Хэш будет лежать рядом, в файле hash.txt. Если хэша нет или он не совпадает, сгенерируем новый. И удалим лог-файл для соответствующей машины. Хэш делаем стандартной Windows-утилитой CertUtil.
Дальше проверяем, нет ли в логах записи о том, что установка именно этой версии ПО на этой машине уже была. Логи пишем сами, в специальную папку (не забудь её открыть на запись). Если лога нет, запускаем установщик. И после установки пишем лог.

Собственно, всё.

Добавляем главный cmd-файл в GPO->Политики компьютера->Автозагрузка. Смотрим логи, радуемся.

Несколько моментов:
- надо бы отслеживать %errorlevel% после того, как установщик отработал. Я поленился. Обычно, если установщик вообще запустился – он отрабатывает корректно. Конечно, предварительно стоит запускать установочные файлы в тестовом режиме вручную;
- думаю сделать набор шаблонов для распространённых программ, типа того же Firefox.

Комментариев нет:

Отправить комментарий