Приручаем WSUS при помощи Ansible и не только +11



Ну что ж, вот и настала пора подружить 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.


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




К сожалению, не доступен сервер mySQL