Спершу хочу трохи пояснити контекст завдання, а вже потім перейду до суті посту. Нещодавно зіткнувся з однієї простої, на перший погляд, завданням. Але, як воно зазвичай буває, на її рішення витратив набагато більше часу, ніж очікувалося. Основна ідея була Токова - потрібно розробити веб портал, за допомогою котрого користувач зможе запросити 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. Це рішення не дуже добре нам підходить по декільком причинам:
- Web Platform Installer запускає свій UI, в якому користувач повинен робити вибір за допомогою миші або клавіатури. Тобто автоматизацією тут і не пахне.
- Трохи дослідивши попередню тему з'ясувалося, що в комплекті 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 копію необхідних нам модулів і проводити їх подальшу установку безпосередньо з локальної копії, а не з глобального сховища. Разом у мене вийшла наступна послідовність дій:
- Встановлюємо локально Web Platform Installer.
- Робимо offline копію Microsoft Azure Powershell cmdlet-ів.
- Додаємо 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-ів. У разі необхідності поновлення до більш нової версії нам потрібно буде пройти весь шлях від початку до кінця і перебудувати / проапдейтіть роль з новим дистрибутивом.