Установка додаткових компонентів на web

Спершу хочу трохи пояснити контекст завдання, а вже потім перейду до суті посту. Нещодавно зіткнувся з однієї простої, на перший погляд, завданням. Але, як воно зазвичай буває, на її рішення витратив набагато більше часу, ніж очікувалося. Основна ідея була Токова - потрібно розробити веб портал, за допомогою котрого користувач зможе запросити N віртуальних машин в Microsoft Azure налаштованих згідно певним шаблоном. Стандартним сценарієм для нас було використання наступного шаблону:

  • віруальная мережу з 3 віртуальних машин
  • одна з машин є контролером домену, а решта входять в цей домен
  • на одній з машин розгорнуть MS SQL Server

Якщо розгортати все це руками з порталу, то це зажадає досить багато часу, а таке оточення ми можемо запитувати по кілька разів на дню. І ось ми почали автоматизувати створення таких оточень і за інструмент автоматизації ми взяли Powershell. Такий вибір був обумовлений фактом, що використовуючи Powershell можна вирішити всі поставлені завдання, а саме: розгорнути N віртуальних машин в Vindows Azure, встановити контролер домену і т.д. Таким чином ми зможемо легко підтримувати нашу систему автоматизації в подальшому.

Основною проблемою в реалізації такого рішення стала необхідність встановити на нашій Web ролі набір Microsoft Azure Powershell cmdlet-ів, власне для відправки команд на Microsoft Azure Management API. Даний набір Powershell cmdlet-ів можна вільно скачати з сайту azure.com (розділ Command-line tools), але він буде встановлений на локальній машині через Web Platform Installer. Це рішення не дуже добре нам підходить по декільком причинам:

  1. Web Platform Installer запускає свій UI, в якому користувач повинен робити вибір за допомогою миші або клавіатури. Тобто автоматизацією тут і не пахне.
  2. Трохи дослідивши попередню тему з'ясувалося, що в комплекті Web Platform Installer-а з недавнього часу з'явилися Web Platform Installer Command Line Tool-и. Саме з їх допомогою можна органіовать автоматизацію установки цікавлять нас доповнень. Але є одне зауваження - Web Platform Installer завжди буде встановлювати саму останню версію Microsoft Azure Powershell cmdlet-ів. З одного боку це добре, але, насправді це дуже погано. Як усі ми пам'ятаємо Startup Tasks запускаються в момент виділення ресурсів для конкретного екземпляра (instance) нашої Web ролі. Тобто в разі збою провізор Microsoft Azure може перевезти один з примірників нашої Web ролі на нове обладнання, там буде запущена інсталяція Microsoft Azure Powershell cmdlet-ів через Web Platform Installer. В результаті ми можемо отримати ситуацію коли на різних примірниках Web ролі ми будемо мати різні версії Microsoft Azure Powershell cmdlet-ів.

Попрацювавши мізками ще трохи було виявлено, що з недавнього часу у Web Platform Installer-а є дуже хитрий режим роботи, який називається Offline режим. Ідея даного режиму проста і прозора - він дозволяє нам зробити поточну offline копію необхідних нам модулів і проводити їх подальшу установку безпосередньо з локальної копії, а не з глобального сховища. Разом у мене вийшла наступна послідовність дій:

  1. Встановлюємо локально Web Platform Installer.
  2. Робимо offline копію Microsoft Azure Powershell cmdlet-ів.
  3. Додаємо Microsoft Azure Powershell cmdlet-и і скрипт для їх установки в проект.

Встановлюємо локально Web Platform Installer

Цей крок найпростіший. Для його виконання нам необхідно:

Справах offline копію Microsoft Azure Powershell cmdlet-ів

У секції Using WebPICMD.exe ми бачимо керівництво по використанню Web Platform Installer Command Line Tool. Тепер запустимо додаток командного рядка (cmd) від імні адміністратора і виконаємо наступні дії:

1. Перейдемо в потрібну директорію.

2. Отримаємо список всіх додатків, які є в репозиторіях Web Platform Installer. Тут я зіткнемося з проблемою пов'язаної з обмеженням на кількість рядків, що відображаються додатком командного рядка. Через це обмеження я можу бачити тільки кінець списку доступних пріліженій. На поточний момент я знайшов 2 способи як це побороти:

2.1. Перенаправляємо потік виведення в файл:

На файлової системи в цій папці буде створено файл all.txt в якому буде список всіх додатків з репозиторіїв Web Platform Installer.

2.2. Скористаємося пошуком по результатам:

В результаті ми отримуємо список з двох колонок. Перша - це ID продукту (який власне нам необхідний), а друга - опис.

3. Робимо локальну копію даного нас продукту:

В результаті виконання цієї команди у нас буде створена папка offline в корені диска C. В цю папку буде поміщено все необхідне для установки пакета WindowsAzurePowershell. Варто відзначити, що Web Platform Installer завантажить нам не тільки сам пакет, але і всі його возмоность заисимости для різних операційних систем. Таким чином у мене папка offline зайняла близько 600 МБ при розмірі файлу windowsazure-powershell.0.7.4.msi близько 9 МБ.

Додаємо Microsoft Azure Powershell cmdlet-и і скрипт для їх установки в проект

Ну і на завершення усієї епопеї ми повинні додати в нашу Web / Worker роль такі речі:

2. Добвляем скрипт командного рядка InstallWindowsAzurePowershell.cmd для установки Microsoft Azure Powershell cmdlet-ів. У моєму прикладі він виглядає чертовски просто:

3. Додаємо нову Startup завдання в файл ServiceDefinition.csdef:

Тепер ми можемо бути впевнені, що кожен екземпляр ролі буде містити єдину версію Microsoft Azure Powershell cmdlet-ів. У разі необхідності поновлення до більш нової версії нам потрібно буде пройти весь шлях від початку до кінця і перебудувати / проапдейтіть роль з новим дистрибутивом.

Схожі статті