OnStart vs Startup Script для пакетного файла?

У меня есть приложение Ruby on Rails, которому нужно найти место в рабочей роли Azure.

В настоящее время я автоматизирую развертывание приложения с помощью пакетного файла — файла, который берет установщики apache и ruby, запускает их, а затем размещает приложение RoR в соответствующем каталоге. После завершения пакетного сценария Apache обслуживает приложение через порт 80.

Я новичок в Azure и пытаюсь понять, как это сделать.

Насколько я понимаю, у меня есть два варианта: OnStart с установочными файлами в хранилище BLOB-объектов или сценарий запуска. Я не знаю, как это сделать, но я нашел метод onStart в файле WorkerRole.vb только что созданного нового проекта Azure.

Мой вопрос: рекомендуется ли использовать OnStart для развертывания приложения (с помощью пакетного сценария)? Если да, то как мне интегрировать скрипт в проект? И как мне приступить к хранению и ссылке на файлы в хранилище BLOB-объектов?

Я знаю, что это вопросы супервысокого уровня. Любой вклад или предлагаемое чтение будет очень полезным. Я пытался использовать Google/искать соответствующие ресурсы, но не смог найти многого. Спасибо за уделенное время!


person RobVious    schedule 14.06.2012    source источник


Ответы (2)


Пока вам не нужен доступ на уровне администратора (например, изменение реестра, установка msi и т. д.), вы можете выполнить настройку из OnStart(), включая запуск скрипта. Просто включите сценарий запуска в свой проект (не забудьте установить для Copy Local значение true).

То же самое и со сценарием запуска: вы вызываете свой cmd-файл, который затем выполняет последовательность для вас. И если вы дадите ему повышенные разрешения, вы сможете запускать установщики, изменять настройки реестра, устанавливать пользовательские счетчики производительности и так далее.

В любом случае: вы можете хранить архив apache, установщики ruby ​​и т. д. в хранилище больших двоичных объектов и при запуске загружать их в локальное хранилище. Это избавляет вас от объединения всего в развертывание, что дает вам несколько преимуществ (возможность обновлять ruby/apache без повторного развертывания, уменьшенный размер пакета и т. д.).

На codeplex есть пример, демонстрирующий основы настройки Tomcat с помощью сценария запуска. В качестве еще одного примера вы можете посмотреть скрипты, установленные через подключаемый модуль Eclipse Windows Azure для Java. Эти скрипты очень похожи. Суть в том, чтобы каким-то образом загружать файлы из хранилища больших двоичных объектов, а затем распаковывать их. проект codeplex, на который я ссылался, указывает на пример приложения, которое выполняет простую загрузку BLOB-объектов. Пакет Eclipse предоставляет аналогичную функциональность в приложении .vbs. Вот фрагмент одного из моих сценариев из проекта на основе Eclipse:

SET SERVER_DIR_NAME=apache-tomcat-7.0.25
SET WAR_NAME=myapp.war
rd "\%ROLENAME%"
mklink /D "\%ROLENAME%" "%ROLEROOT%\approot"
cd /d "\%ROLENAME%"
cscript /NoLogo util\unzip.vbs jre7.zip "%CD%"
cscript /NoLogo util\unzip.vbs tomcat7.zip "%CD%"
copy %WAR_NAME% "%SERVER_DIR_NAME%\webapps\%WAR_NAME%"
cd "%SERVER_DIR_NAME%\bin"
set JAVA_HOME=\%ROLENAME%\jre7
set PATH=%PATH%;%JAVA_HOME%\bin
cmd /c startup.bat

В проекте codeplex есть похожий скрипт.

Не забывайте: вам нужно настроить входную конечную точку для вашей роли (часть свойств роли).

Для помещения BLOB-объектов в хранилище BLOB-объектов существуют как бесплатные инструменты (например, Clumsy Leaf CloudXplorer), так и платные инструменты (например, Cloud Storage Studio компании Cerebrata).

Чтобы загрузить большие двоичные объекты в локальное хранилище, вы можете либо написать несколько строк кода .net (из OnStart), либо просто использовать утилиту, указанную в проекте codeplex.

person David Makogon    schedule 14.06.2012
comment
Спасибо за постоянную помощь Дэвиду. Я начал работать с подходом OnStart, но столкнулся с проблемой прав доступа при попытке загрузки в локальное хранилище. Это в сочетании с ответами здесь заставляет меня думать, что сценарий запуска, возможно, стоит попробовать. - person RobVious; 14.06.2012
comment
Я хотел бы знать, с какой проблемой разрешений вы столкнулись. Не спешите сбрасывать со счетов использование OnStart() — в целях отладки довольно просто пройти через ваше приложение (по сравнению с попыткой присоединения к отдельному процессу). Для задач запуска часто требуются дополнительные методы отладки (включая, возможно, RDP-подключение к вашему экземпляру для запуска сценария вручную). - person David Makogon; 14.06.2012
comment
На самом деле это оказалось недоразумением с моей стороны - я думал, что System.IO.File.OpenWrite(@C:\testfolder) должен указывать на каталог, но на самом деле он указывает на сам файл. Итак, проблема решена, и я продолжаю путь OnStart. Несвязанная проблема. Я загрузил папку с множеством файлов и подкаталогов, составляющих этот проект, вплоть до контейнера. Хотя, когда я загружаю его, файлы больше не сохраняются из-за того, как они сглажены. Любая идея, как лучше всего обращаться с каталогом? - person RobVious; 14.06.2012
comment
Рад, что вы решили это. Я видел ваш другой вопрос - я отвечу в ближайшее время. - person David Makogon; 14.06.2012
comment
Вот это да. Сегодня ты просто спас меня, Дэвид :) Я ценю это. - person RobVious; 14.06.2012

Когда вы находитесь внутри функции OnStart(), лучше выполнить настройку ролей, например привязку IP и т. д. Однако, если вы хотите установить среду выполнения, загрузить ZIP-файл приложения, настроить параметры для конкретной роли, лучше всего использовать задачу запуска. Пожалуйста, посетите мой блог Windows Azure: задача запуска или OnStart(), что выбрать?, чтобы узнать об этом подробнее.

Теперь в вашем случае лучше всего использовать задачу запуска. Что вы можете сделать, как показано ниже:

  1. Создайте пакет ROR в виде ZIP-файла и поместите его в хранилище BLOB-объектов Windows Azure.
  2. Создайте пакетный файл Cmmmand, который будет делать:

    2.1 Загрузите ZIP-файл

    2.2 Распаковать содержимое в ZIP в определенное место

    2.3 Обновите статус до AZure Blob Storage (необязательно)

  3. В вашей функции OnStart() вам просто нужно настроить ROR

Код будет выглядеть так, как показано ниже, если для имени конечной точки TCP «RORWeb80» установлено использование порта 80:

TcpListener RoRPortListener = new TcpListener(RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["RORWeb80"].IPEndpoint);
RoRPortListener.Start();

Я написал пример приложения для рабочей роли на основе Tomcat/Java, которая делает то же самое. Итак, что вы можете сделать, просто замените ZIP-файл Tomcat на ROR ZIP и точно повторно используйте код.

person AvkashChauhan    schedule 14.06.2012
comment
Большое спасибо, Авкаш. Мой пакетный скрипт берет Apache msi, устанавливает apache, затем берет ruby ​​exe и устанавливает ruby. Затем я помещаю проект RoR в какой-нибудь каталог и запускаю приложение, запуская apache. Кажется, что задача запуска лучше исключительно из-за возможности иметь повышенные разрешения. Это правильно? - person RobVious; 14.06.2012
comment
да, вы можете сделать все это из задачи запуска, и это будет лучшим решением. - person AvkashChauhan; 14.06.2012