История о Ruby на Microsoft Azure

Ruby-разработчики могли использовать Microsoft Azure с самой ранней стадии развития платформы, и с каждым годом поддержка Ruby платформой увеличивалась как посредством создания и развития инструментов разработки Ruby для Microsoft Azure, так и косвенным образом – например, с релизом виртуальных машин появилась возможность разработки Ruby-приложений в IaaS-окружении. Для тех, кто не хочет озадачивать себя реалиями инфраструктурными, существует уже преднастроенный образ для Ruby в хранилище виртуальных машин VMDepot. Ниже я расскажу о нескольких способах разработки Ruby в Microsoft Azure, какой из этих способов будет удобнее – решать вам. 

Изучив вехи развития платформы в сторону разработки под Ruby, можно выделить несколько этапов, каждый из которых по-своему важен:

• Создание Microsoft Azure SDK для Ruby (Microsoft Azure SDK Ruby), с помощью которой можно использовать различные сервисы Microsoft Azure из Ruby-приложения. Это очень важная веха, так как без усилий, которые вкладывает сам вендор платформы в конкретное направление, не получится говорить о том, что это направление является полноценным “жителем” экосистемы. Как и многие другие инструменты Microsoft, Ruby SDK — Open Source, и расположена на GitHub — github.com/WindowsAzure/azure-sdk-for-ruby
• Выход в свет IaaS в виде виртуальных машин. С этим все понятно – можно сделать под себя виртуальный сервер.
• Выход в свет хранилища образов VMDepot. Для тех, кто хочет получить готовый образ и начать работать сразу.

Способ 1: Microsoft Azure Linux-сервер, Ubuntu 12.04 LTS

Развернем вручную Linux-сервер и настроим под себя рабочую среду. Для этого перейдем на портал управления Microsoft Azure и нажмем 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. 



Выполним команду sudo apt-get update. Не забывайте использовать 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 и указать ее для использования умолчанию:

rvm install 1.9.3 rvm use 1.9.3 –default

Способ 2: Установка ВМ из VMDepot


Из VMDepot можно установить преднастроенные коммьюнити образы ВМ, и они будут автоматически развернуты и запущены на Microsoft Azure в вашем аккаунте. 
Перейдем сразу на страницу необходимого образа.
Нажмем DEPLOYMENT SCRIPT для получения скрипта развертывания. Скрипт предназначен для Azure CLI, и, если у вас не установлен CLI, то воспользоваться им не получится (загрузить его можно по ссылке).
Запустите CLI. Дальше выполним следующие команды для настройки окружения для CLI:

azure account download (будет загружен файл с настройками подписки) azure account import [путь_к_файлу_с_настройками] azure storage account list (будет выведен список аккаунтов хранилища, если таковых нет, необходимо создать) azure storage account set [имя_аккаунта_хранилища]

После выполнения всех команд можно выполнить скрипт, скопированный с VMDepot,. Это займет некоторое время, после чего новая ВМ появится в списке ВМ на портале управления Microsoft Azure. Эта ВМ является отличным набором различных сред разработки и окружений, включая PHP, Ruby, Python, Java и различных фреймворков, а также таких СУБД как mysql, postgresql, и apache/nginx.

Способ 3: PaaS, Ruby + Sinatra + Azure


В качестве PaaS на Microsoft 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.
Теперь, если у вас установлен эмулятор Microsoft Azure, можно нажать F5 (во время запуска обратите внимание на запускающиеся файлы – это результаты выполнения install.cmd и start.cmd) и пронаблюдать результат по адресу localhost:81 (локальный эмулятор автоматически делает ремаппинг с 80 порта на 81 во избежание конфликтов).

Процесс дальнейшей разработки можно разбить на несколько этапов:
1) Создание программного кода и файлов .rb
2) Выполнение модификации файлов install.cmd и start.cmd, либо разработка новых исполняемых файлов, для автоматизации внесения изменений или создания совершенно нового окружения разработки и редактирование соответствующей секции в ServiceDefinitions.csdef
3) Внесение команд по управлению программным кодом в start.cmd

В данной заметке я кратко рассмотрел развертывание простейшей экосистемы для разработки на Ruby. Дальше выбор за вами – разрабатывать локально или иметь постоянно доступную среду разработки, с которой можно делать что угодно, и на которую можно зайти из любого места – по последним данным, это становится все более актуально. :)

Автор статьи: Александр Белоцерковский.