Ansible под Windows с костылями, подпорками и интеграцией с Vagrant
Так получилось, что на нашем проекте сейчас используется Ansible. Я не буду останавливаться на том, что такое Ansible, как его готовить и с чем употреблять, а также на том, почему используется именно он (ибо выбор этот для условий эксплуатации под ОС от Microsoft оптимальным не назовешь) — в контексте этого поста предлагаю считать это данностью. Также ни для кого не секрет, что очень много веб-разработчиков по разным причинам работает под Windows. Нежелание сражаться с линуксами, нехватка денег на мак, танчики после работы, корпоративная политика — причин тоже может быть вагон. И о них в этом посте тоже не будет ни слова.
Если обстоятельства таковы, что вам нужно использовать Ansible под Windows (что, в принципе, не так уж и напряжно, хоть и нигде толком не описано) и, чего доброго, интегрировать это дело с Vagrant под Windows — прошу под кат.
Начну, пожалуй, с предупреждения. Если вы выбираете провиженер для автоматизации развертывания проектной инфраструктуры и в качестве мастера хотите использовать свою рабочую станцию на Windows и только её — лучше не используйте Ansible. Вот что написано в его документации по установке: “Currently Ansible can be run from any machine with Python 2.6 installed (Windows isn’t supported for the control machine)”. Всё описанное ниже — система костылей и подпорок на крайний случай. И если всё же крайний случай наступил или вы не ищете легких путей, поехали.
Установка
В общем, тут ничего удивительного нету. Если сабж не поддерживает Windows из коробки, а нормально работает только под *nix — можно попытаться устроить в винде небольшой *nix при помощи Cygwin. Более того, можно нагуглить уже готовые инстукции о том, как поднять Ansible под Cygwin, но мне удалось сделать это, как мне кажется, проще и чище, чем, например, автору этой инструкции.
Забегая вперед, скажу, что для меня это был первый опыт работы с Cygwin’ом (сам я давно на Linux’е, эта инстукция в целом — попытка дать возможность команде работать с опрометчиво выбранным без скидки на Windows инстументом) и установка пакетов там оказалась штукой не совсем для меня очевидной. Пришлось загуглить: оказывается, чтобы установить пакет, нужно, найдя его в списке, нажать вот на эту иконку — тогда изменится его статус; чтобы добавить или удалить пакеты, нужно запустить инсталлятор и идти тем же путем, что и при начальной установке.
Еще одна заметка. Если вы из Беларуси, используйте зеркало Белтелекома (http://ftp.mgts.by/pub/cygwin) — по опыту это единственный способ установить всё быстро. Для этого введите указанный адрес в поле под списком зеркал и нажмите Add, после чего выберите его в списке.
При установке Cygwin выберите следующие пакеты:
- binutils (из Devel)
- libuuid-devel (из Libs)
- python (from Python)
- python-crypto (from Python)
- python-setuptools (from Python)
Опционально — gcc-core из Devel, тогда некоторые питоновские модули соберутся из исходников на C, в противном случае останется довольствоваться питоновской реализацией.
Чем объясняется этот набор? Нормально поставить Ansible можно только через питоновский пакетный менеджер pip, а он не работает без libuuid-devel, по меньшей мере на версии Cygwin для x86_64. binutils позволяет pip’у использовать Cygwin’овскую реализацию libuuid. Остальное, думаю, понятно — для самого Ansible.
Сразу после устновки Cygwin рекомендую объяснить ему, где находится ваша домашняя директория. По умолчанию он будет использовать в качестве оной какую-то свою папку; использование в этом качестве виндовой пользовательской папки кажется мне несколько более понятным и прозрачным; кроме того, это решает некоторые пролемы, которые возникают при запуске из-под Cygwin’а Vagrant’а — без дополнительных шаманских пассов он будет постоянно пересоздавать виртуалку.
Это можно сделать следующей командой, выполненной в Cygwin:
mkpasswd -l -c -p «$(cygpath -H)» > /etc/passwd
С обвязками закончили. Теперь сам Ansible. Тут всё неожиданно просто пару команд в Cygwin — и готово:
- easy_install pip
- pip install ansible==1.5.3
Почему именно 1.5.3, спросите? Это последняя на данный момент версия, работающая под Windows и не имещая некоторых назойливых багов.
Кроме этого, нужно объяснить Ansible, что такую фичу ssh, как ControlMaster, использовать не нужно (под Windows она не работает). Суть ее в следующем: ssh устанавливает соединение с хостом, создает сокет и не убивает его в течение некоторого конфигурируемого времени. При следующем подключении он, если возможно, использует этот сокет (уже установленное соединение), чтобы не устанавливать его заново и Ansible работает без накладных расходов по установке соедиения на каждый таск. Сделать это можно через переменную окружения: ANSIBLE_SSH_ARGS=-o ControlMaster=no или через конфиг Ansible, указавтам в секции [ssh_connection] опцию ssh_args = -o ControlMaster=no . На stackoverflow можно найти немного информации на эту тему.
В общем и целом, это всё. После этого из Cygwin можно использовать ansible-playbook как и в *nix.
Ansible с Vagrant: свяо атмосфреа
В теории, Vagrant интегрируется с Ansible красиво и прозрачно. Но только не под Windows. При первой же попытке запустить vagrant provision с Ansible в качестве провиженера под Windows вы получите какую-нибудь замысловатую ошибку. Причина достаточно проста: Ansible будет работать только под Cygwin. Найти простой способ заставить vagrant вызывать его нужным способом мне не удалось. Казалось бы, велика ли беда: соорудить батник по имени ansible-playbook.bat, который будет запускать уже реальный ansible-playbook в Cygwin, положить его в %Path% так, чтобы Vagrant попадал на него — всего-то! Но не тут-то было.
Vagrant под Windows — это такая же системы костылей и подпорок со своим bash’ем и коллекцией *nix утилит. Соответственно, просто написать bash не получится: Vagrant разбавит %Path% путем к своей директории с *nix-утилитами (кстати, тем же грешен и GitBash), а нам нужен именно Cygwin и именно его утилиты.
В итоге путем проб, ошибок и длительных страданий был рожден этот batch. Он может быть отвратителен, но никаких познаний в скриптинге под Windows у меня не было, поэтому слепил из того, что было, следуя методологии StackOverflow Driven Development.
Также в процессе оказалось, что это лучшее место, чтобы задать упомянутую выше переменную окружения ANSIBLE_SSH_ARGS . Задавать ее в конфиге неудобно, потому что Ansible не мержит конфиги, а берет первый найденный — соответственно, либо не получится использовать конфиг Ansible в контексте проекта, либо придется задать этот параметр для всех, даже для тех, кому он не нужен (а выключение ControlMaster очень сильно замедляет провиженинг). Также его можно было указать в Vagrant-файле, но тогда без дополнительных подпрыгиваний не получилось бы использовать ansible-playbook без Vagrant’а.
Этот .bat предполагает, что Cygwin’овский bin добавлен в %Path% (неважно, в какую именно часть), а путь к самому батнику добавлен в %Path% перед Cygwin’овским bin.
В итоге всё вышеописанное уложилось буквально в несколько достаточно кратких инстукций в шагах по развертыванию проекта и было более-менее успешно обкатано на вновь пришедших на проект разработчиках разного уровня.
Приручаем WSUS при помощи Ansible и не только
Ну что ж, вот и настала пора подружить 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:
Затем нам понадобится установить пакет pywinrm для подключения к системам Windows и непосредственно систему Ansible:
Проверить установку можно командой ansible —version.
Проверка установки.
Вместо пакета в теории pywinrm можно использовать любое другое средство для управления Windows с машины на Linux. Часть из них разобрана в статье «Перекрестное опыление: управляем Linux из-под Windows, и наоборот».
Теперь нужно разрешить подключение к Windows по WinRM. Для этого есть уже готовый скрипт ConfigureRemotingForAnsible.ps1, доступный на GitHub. Ну, а как запускать скрипты на удаленных машинах вы уже знаете.
Проверить подключение к Windows можно командой:
Проверка подключения успешна.
Теперь можно заняться созданием 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:
А если надо просто посчитать, сколько обновлений не хватает, playbook будет таким:
Для установки всех доступных обновлений с последующей перезагрузкой будет подобный playbook:
Напомню, что для работы со списком серверов понадобится файл инвентаризации. Например, такой:
И теперь для установки обновлений только на контроллеры домена можно использовать playbook:
Команда, которая проделает все эти операции, будет такой:
Внимательный читатель может спросить про источник скачиваемых обновлений. Источник будет тот, что настроен на компьютере: будь то 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.
В комментариях добавляйте свои любимые инструменты для работы с обновлениями и не только.