История Ruby on Rails на Windows Azure
Ruby-разработчики имели возможность использовать Windows Azure с ранней стадии развития платформы, и с каждым годом поддержка Ruby платформой увеличивалась как посредством создания и развития инструментов разработки Ruby для Windows Azure, так и косвенным образом – например, с релизом виртуальных машин появилась возможность разработки Ruby-приложений в IaaS-окружении. Для тех, кто не хочет озадачивать себя реалиями инфраструктурными, существует уже преднастроенный образ для Ruby в хранилище виртуальных машин VMDepot. Ниже я расскажу о нескольких способах разработки Ruby в Windows Azure, какой из этих способов будет удобнее – решать, конечно же, вам.
Изучив же вехи развития платформы в сторону разработки под Ruby, можно выделить несколько этапов, каждый из которых по-своему важен:
1) Создание Windows Azure SDK для Ruby (Windows Azure SDK Ruby), с помощью которой можно использовать различные сервисы Windows Azure из Ruby-приложения. Это очень важная веха, так как без усилий, которые вкладывает сам вендор платформы в конкретное направление, не получится говорить о том, что это направление является полноценным “жителем” экосистемы. Нелишне также уточнить, что, как и многие другие инструменты Microsoft, Ruby SDK полностью Open Source и расположена на GitHub - https://github.com/WindowsAzure/azure-sdk-for-ruby
2) Выход в свет IaaS в виде виртуальных машин. С этим все понятно – можно сделать под себя виртуальный сервер.
3) Выход в свет хранилища образов VMDepot. Для тех, кто хочет получить готовый образ и начать работать сразу.
Способ 1: WindowsAzureLinux -сервер, Ubuntu 12.04 LTS
Развернем вручную Linux-сервер и настроим под себя рабочую среду. Для этого перейдем на портал управления Windows Azure (https://manage.windowsazure.com) и нажмем New=>COMPUTE=>VIRTUAL MACHINE => QUICK CREATE.
Введем необходимые данные:
· DNS NAME: имя, под которым виртуальная машина будет доступна извне
· IMAGE: образ, из которого будет развернута виртуальная машина. Выбираем Ubuntu Server 12.04 LTS.
· SIZE: один из доступных размеров ВМ. Выбираем Medium.
· USER NAME: по умолчанию azureuser. Изменить на портале нельзя.
· NEW PASSWORD/CONFIRM: пароль.
· REGION/AFFINITY GROUP: регион, в котором будет располагаться ВМ, либо аффинная группа (для обеспечения максимальной близости внутри датацентра).
Если необходима более точная настройка параметров, то выбирайте FROM GALLERY – вам будет доступно большее количество настроек.
Необходимые для подключения (например, по Putty) данные получаются после нажатия на название ВМ в разделе SSH Details на вкладке Dashboard.
Выполним командуsudoapt - getupdate . Не забывайте использовать sudo на ВМ под Linux, это дополнительная безопасность и уверенность. Дальше желательно установить для удобства window manager:
sudo apt-get install ubuntu-desktop
Включим RDP-доступ к GUI. Это делается на вкладке Endpoints: нужно нажать Add и ввести данные – точку доступа по протоколу TCP и значение порта 3389.
В ВМ установим xrdp: sudo apt-get install xrdp.
Теперь можно установить окружение для Ruby On Rails:
sudo apt-get upgrade
sudo apt-get install ruby1.9.1 ruby1.9.l-dev build-essential libsqlite3-dev nodejs -y sudo gem install bundler –no-rdoc –no-ri
sudo apt-get -y install git-core curl
curl -L https://get.rvm.io | bash -s stable
Мы также установим Ruby Version Manager (RVM), что полезно для, например, управления разными версиями Ruby и так далее. Добавим RVM в окружение:
echo 'source ~/.rvm/scripts/rvm' >> ~/.bash_aliases && bash
И проверим, все ли установлено для корректной работы:
rvm requirements
Если все в порядке, можно, например, установить версию Ruby 1.9.3 и указать ее для использования умолчанию:
rvm install 1.9.3
rvm use 1.9.3 --default
Способ 2: Установка ВМ из VMDepot
Из VMDepot можно установить преднастроенные образы ВМ, и они будут автоматически развернуты и запущены на Windows Azure в вашем аккаунте.
Перейдем сразу на страницу необходимого образа - https://vmdepot.msopentech.com/Vhd/Show?vhdId=7678\&version=8714 .
Нажмем DEPLOYMENT SCRIPT для получения скрипта развертывания. Скрипт предназначен для Azure CLI, и, если у вас не установлен CLI, то воспользоваться им не получится (загрузить его можно по ссылке https://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/command-line-tools/).
Запустите CLI. Дальше выполним следующие команды для настройки окружения для CLI:
azure account download (будет загружен файл с настройками подписки)
azure account import [путь_к_файлу_с_настройками]
azure storage account list (будет выведен список аккаунтов хранилища, если таковых нет, необходимо создать)
azure storage account set [имя_аккаунта_хранилища]
После выполнения всех команд можно выполнить скрипт, скопированный с VMDepot,. Это займет некоторое время, после чего новая ВМ появится в списке ВМ на портале управления Windows Azure. Эта ВМ является отличным набором различных сред разработки и окружений, включая PHP, Ruby, Python, Java и различных фреймворков, а также таких СУБД как mysql, postgresql, и apache/nginx.
Способ 3: PaaS , Ruby + Sinatra + Azure
В качестве PaaS на Windows Azure используется концепция Cloud Service – приложения, состоящего из нескольких традиционных проектов (фронтенда и бэкенда, например) и одного нового – собственно, Cloud Service, в котором содержится вся конфигурация, использующаяся платформой для развертывания и настройки приложения в облаке.
Создадим Cloud Service проект в Visual Studio и добавим в него Worker Role. В этом проекте-роли будет происходить установка окружения и приложения Ruby.
Теперь нужно загрузить установщик Ruby – мы положим его в Worker Role, на ВМ которой затем и будет развернуто окружение. Установщик можно загрузить с RubyInstaller.com. Добавим установщик в проект Worker Role и установим атрибут Copy to output directory в Copy if newer для того, чтобы он включился в пакет. Добавим также файл install.cmd с тем же значением атрибута Copy to output directory и следующим содержанием:
rubyinstaller-2.0.0-p0-x64.exe /silent
D:\Ruby200-x64\bin\gem.bat install sinatra --no-ri --no-rdoc
Сохранять все файлы нужно с кодировкой US-ASCII, иначе могут возникать ошибки.
Добавим файл main.rb в Worker Role со значением атрибута copy if newer и содержанием:
require 'sinatra'
set :environment, :production
set :port, 8080
get '/' do
"Hello World!"
end
Добавим файл start.cmd с тем же значением атрибута и следующим содержанием:
D:\Ruby200-x64\bin\ruby.exe main.rb
Однако автоматически все не запустится, поэтому нужно внести коррективы в конфигурацию самой роли в проекте Cloud Service. Откроем файл ServiceDefinition.csdef и добавим код, выделенный ниже:
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="RubyTest" xmlns="https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-10.2.2">
<WorkerRole name="WorkerRole1" vmsize="Small">
<Startup>
<Task commandLine="install.cmd" executionContext="elevated" taskType="simple"></Task>
<Task commandLine="start.cmd" executionContext="elevated" taskType="background"></Task>
</Startup>
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="tcp" port="80" localPort="8080" />
</Endpoints>
</WorkerRole>
</ServiceDefinition>
Таким образом мы выполнили настройку таким образом, что при запуске ВМ будут запущены с повышенными привилегиями файлы install.cmd и start.cmd, а также открыт порт 80 (для внешних клиентов), который будет перенаправлять трафик на внутренний порт 8080.
Теперь, если у вас установлен эмулятор Windows Azure, можно нажать F5 (во время запуска обратите внимание на запускающиеся файлы – это результаты выполнения install.cmd и start.cmd) и пронаблюдать результат по адресу https://localhost:81 (локальный эмулятор автоматически делает ремаппинг с 80 порта на 81 во избежание конфликтов).
Процесс дальнейшей разработки можно разбить на несколько этапов:
1) Создание программного кода и файлов .rb
2) Выполнение модификации файлов install.cmd и start.cmd, либо разработка новых исполняемых файлов, для автоматизации внесения изменений или создания совершенно нового окружения разработки и редактирование соответствующей секции в ServiceDefinitions.csdef
3) Внесение команд по управлению программным кодом в start.cmd
В данной заметке я кратко рассмотрел развертывание простейшей экосистемы для разработки на Ruby.