Ну что ж, вот и настала пора подружить Windows-обновления с миром Open Source. В этой статье разнообразим быт интеграцией Ansible со всеми возможными источниками обновлений Windows-машин. Хотя возможности системы значительно шире простой раскатки обновлений на серверы и рабочие станции, но ведь надо с чего-то начинать.


Заодно избавимся от досадных неудобств WSUS, если вы предпочитаете «старую школу».


За что мы не любим WSUS


Про настройку Windows Server Update Services рассказывать я не буду, благо она тривиальна. Сосредоточусь на минусах.



Интерфейс WSUS почти не менялся на протяжении всей истории.


Невозможность установки по требованию. Действительно, для штатной работы WSUS подходит неплохо — обновления спокойно себе настраиваются и ставятся по локальной сети при выключении компьютеров. Но если нужно срочно установить патчи безопасности, то придется выкручиваться скриптами и решениями для запуска этих самых скриптов. В этом может помочь наш материал «1000++ способ запуска команд на удаленном компьютере».


Отсутствие штатного способа установки обновлений стороннего ПО. Если есть сервер обновлений, то выглядит разумным использовать его не только для обновлений программ MS, но для других решений. Например, в не к ночи упомянутом Adobe Flash Player уязвимости находятся с завидной регулярностью, да и радовать пользователей новыми возможностями FireFox тоже хотелось бы. Для того чтобы наладить установку обновлений через WSUS, приходится использовать сторонние решения вроде WSUS Package Publisher. Посмотреть примеры настройки можно в статье «Установка любого программного обеспечения средствами WSUS — 2».


Использование встроенной БД Windows. При стандартной установке WSUS использует WID — Windows Internal Database. По сути это маленький встроенный SQL Server с базой данных. В случае каких-то неполадок или конфликтов — к примеру, если у вас на одном сервере живет Remote Desktop Connection Broker и WSUS, — приходится чинить эту базу, настраивать права доступа и всячески развлекаться. Да и резервное копирование бы не помешало. По счастью, WSUS может использовать и классический SQL. Для переноса БД WSUS можно воспользоваться инструкцией Migrating the WSUS Database from WID to SQL от Microsoft.


Необходимость обслуживания и неочевидная настройка сбойных клиентов. Как это бывает с продуктами от Microsoft, рано или поздно WSUS начинает тормозить: клиенты долго не могут к нему подцепиться и скачать обновления. Сборник советов и оптимизаций есть в статье «Ускоряем работу WSUS» и в комментариях к ней.


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


Устанавливаем обновления при помощи Ansible


Практически любая система управления конфигурациями может облегчить работу с обновлениями. Разберем пример на базе Ansible для установки обновлений по требованию.


Устраивать холивар, что лучше из бесплатных систем — Ansible, Chef, Puppet или вовсе Salt, нет ни малейшего желания. Система Ansible выбрана за отсутствие необходимости использования агентов и за простоту настройки. И, конечно, из-за Python: ведь этот язык намного проще освоить начинающим автоматизаторам, в отличие от Ruby.

Стоит отметить, что помимо решения задачи, это будет неплохое подспорье для ознакомления с принципами работы подобных систем. Если, конечно, вы еще не развлекались установкой Streisand, особенно, когда что-то в процессе идет не так. А если вы уже используете Ansible или другие модные решения, то запросто сможете и обновления устанавливать. С азами Ansible я рекомендую ознакомиться в статье «Пособие по Ansible», а ниже — пошаговая инструкция по работе с обновлениями.


Для начала подготовим сервер Ansible. Подойдет практически любой GNU\Linux дистрибутив, но примеры команд я буду приводить для Ubuntu Server (так исторически сложилось).


Для начала установим пакетный менеджер для приложений на Python:


apt-get install python-pip
pip install --upgrade pip
pip install --upgrade virtualenv

Затем нам понадобится установить пакет pywinrm для подключения к системам Windows и непосредственно систему Ansible:


sudo pip install pywinrm
sudo pip install ansible

Проверить установку можно командой ansible --version.



Проверка установки.


Вместо пакета в теории pywinrm можно использовать любое другое средство для управления Windows с машины на Linux. Часть из них разобрана в статье «Перекрестное опыление: управляем Linux из-под Windows, и наоборот».

Теперь нужно разрешить подключение к Windows по WinRM. Для этого есть уже готовый скрипт ConfigureRemotingForAnsible.ps1, доступный на GitHub. Ну, а как запускать скрипты на удаленных машинах вы уже знаете.


Проверить подключение к Windows можно командой:


ansible windows -m win_ping


Проверка подключения успешна.


Теперь можно заняться созданием playbook. Нам облегчит жизнь тот факт, что разработчики Ansible уже подумали за нас и сделали модуль win_updates, как раз для решения таких задач.


Playbook — это «инструкция», которая говорит системе управления конфигурациями, что же ей делать. Разумеется, пошаговая.

Любой playbook является файлом в формате yml и представляет из себя набор директив — у каждого модуля они свои. Модуль winupdate позволяет использовать следующие директивы (жирным выделены значения по умолчанию):


Название Значение Описание
category_names Application
Connectors
CriticalUpdates
DefinitionUpdates
DeveloperKits
FeaturePacks
Guidance
SecurityUpdates
ServicePacks
Tools
UpdateRollups
Updates
Категория обновлений.
whitelist Номер обновления или шаблон имени. Непосредственно номер устанавливаемых обновлений вида KB01234 или шаблон имени в виде регулярного выражения PowerShell.
blacklist Номер обновления или шаблон имени. Непосредственно номер обновлений, которые не нужно устанавливать, вида KB01234 или шаблон имени в виде регулярного выражения PowerShell.
reboot yes
no
Требуется ли перезагрузка после обновления.
reboot_timeout секунды, 1200 Сколько времени ждать машину после перезагрузки.
state installed
searched
Устанавливать ли обновления, или только искать.
log_path путь к файлу Журнал установки, при этом папка должна существовать.

Таким образом, для установки определенных обновлений подойдет следующий playbook:


- name: Install specific updates based on the KBs for those updates
  win_updates:
    category_name:
    - SecurityUpdates

    whitelist:
    - KB4073819
    - KB4074228

А если надо просто посчитать, сколько обновлений не хватает, playbook будет таким:


  – name: Check for missing updates
          win_updates: state=searched
          register: update_count

Для установки всех доступных обновлений с последующей перезагрузкой будет подобный playbook:


- name: Install all critical and security updates
  win_updates:
    category_names:
    - CriticalUpdates
    - SecurityUpdates
    - UpdateRollups
    state: installed
  register: update_result

        - name: reboot host if required
          win_reboot:
          when: update_result.reboot_required

Напомню, что для работы со списком серверов понадобится файл инвентаризации. Например, такой:


[DCs]
dc1.mydomain.local
dc2.mydomain.local

[AppServers]
app1.mydomain.local
app2.mydomain.local

[DBServers]
db1.mydomain.local
db2.mydomain.local

И теперь для установки обновлений только на контроллеры домена можно использовать playbook:


- hosts: DCs
  tasks:
  - name: Choose which Windows updates to install
  win_updates:
    category_names:
      - SecurityUpdates
      - CriticalUpdates
      - UpdateRollups

Команда, которая проделает все эти операции, будет такой:


ansible-playbook -i inventory.yml -s windowsupdates.yml

Внимательный читатель может спросить про источник скачиваемых обновлений. Источник будет тот, что настроен на компьютере: будь то Windows Update в интернете или локальный WSUS. Даже если до настройки WSUS руки не дошли, можно дать команду на установку нужных срочных апдейтов, особенно если детальки Lego под ноги уже высыпались.


Остается добавить, что не обязательно использовать именно Ansible. Например, для системы управления конфигурациями Chef можно использовать Cookbook Wsus Client или более навороченный boxstarter. Аналогичные модули существуют и для Puppet. В общем-то практически любая система управления конфигурациями может что-то подобное, в том числе и MS SCCM.


Напоследок приведу еще несколько заинтересовавших меня инструментов.


Прочие системы и решения


WSUS offline. Программа, позволяющая скачать необходимые обновления одним пакетом, при необходимости можно запаковать в ISO. Также можно положить пакет в сетевую папку и устанавливать обновления скриптами, без развертывания полноценного WSUS.


Patch Management от Comodo. Система установки обновлений для Windows и другого ПО. В отличие от других решений — бесплатна.



Интерфейс Comodo Patch Management.


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


BatchPatch. Единственная из платных систем, попавшая в список. Позволяет устанавливать ПО, обновлять его, как и Windows, и многое другое. Отличается олдскульным дизайном, а также стоимостью не за количество обслуживаемых хостов, а за пользователей программы, т.е администраторов. Пожалуй, это одно из немногочисленных решений, позиционирующих себя как аналог WSUS. Цена начинается от $400.



Интерфейс BatchPatch.


В комментариях добавляйте свои любимые инструменты для работы с обновлениями и не только.

Комментарии (5)


  1. rionnagel
    21.06.2018 15:44

    Паппетом раскатываю суперкритичные виндовые апдейты, но я думаю это не принципиально — можно чем угодно.
    С ансиблом мне понравилась тема — дружить его с gitlab-ci. Воркер стоит на сервере с ансиблом, обновляет код из гита, проверяет синтаксис, делает тесты на тестовых машинах и после чего делать фрагментированный вывод с уже ручным управлением, тестовый рендж компов1 -> тестовый рендж компов2 -> все остальные, все отчеты и ошибки видишь в нормальном виде в пайплайне — на сервер лезть не надо, просто делаешь пуш кода и жмёшь кнопочки на вебморде гитлаба. Да и докером это можно обмотать.


  1. Balintrue
    22.06.2018 07:03

    Если мы говорим про Windows, то как можно обойти вниманием SCCM? Да, он монструозен и неповоротлив, как и многие другие инструменты от MS, но если его правильно «приготовить», то со своей задачей он вполне справляется. Я прекрасно понимаю, что для сред, где сервера не нужно считать сотнями SCCM избыточен, но упомянуть о нем все-таки надо — штатное средство производителя)
    Также хочу поблагодарить за обзор средств, позволяющих управлять обновлениями, про утилиту от COMODO и WSUS Offline слышал и пользовался, но они не оставили у меня впечатления продуктов уровня Enterprice, но для небольших сред вполне подходят.
    Пока писал вспомни еще одну поделку: в китайском антивирусе 360 Total Security есть утилита установки обновлений, для «домашних» сред самое то)


  1. Bessnov
    22.06.2018 09:40

    Бывают такие обновления которым для доустановки нужно обязательно перезагрузиться.
    Если это делать принудительно, то получите от пользователей кучу негатива с потерянными данными и впустую сделанной работой. А если этого не делать, то в чём отличие от установки обновлений(через WSUS) при выключении компьютера вечером? С уведомлением пользователя, не рассматриваем — пользователь будет откладывать установку бесконечно.


  1. blexeyaykov
    22.06.2018 09:40

    Платное средство управления серверами, включая подсистему гибкого обновления систем Windows/Linux/Solaris/IBM AIX — TrueSight Server Automation (ранее называлось BMC Server Automation, Bladelogic Server Automation, BSA): docs.bmc.com/docs/ServerAutomation/89/patch-management-overview-and-workflow-653396891.html


    1. blexeyaykov
      22.06.2018 10:02

      А также и HP-UX