История 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 – вам будет доступно большее количество настроек.

image

Необходимые для подключения (например, по Putty) данные получаются после нажатия на название ВМ в разделе SSH Details на вкладке Dashboard.

image

Выполним команду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.