Ruby-разработчики могли использовать Windows Azure с самой ранней стадии развития платформы, и с каждым годом поддержка Ruby платформой увеличивалась как посредством создания и развития инструментов разработки Ruby для Windows Azure, так и косвенным образом – например, с релизом виртуальных машин появилась возможность разработки Ruby-приложений в IaaS-окружении. Для тех, кто не хочет озадачивать себя реалиями инфраструктурными, существует уже преднастроенный образ для Ruby в хранилище виртуальных машин VMDepot. Ниже я расскажу о нескольких способах разработки Ruby в Windows Azure, какой из этих способов будет удобнее – решать вам.
Изучив вехи развития платформы в сторону разработки под Ruby, можно выделить несколько этапов, каждый из которых по-своему важен:
• Создание Windows Azure SDK для Ruby (Windows Azure SDK Ruby), с помощью которой можно использовать различные сервисы Windows Azure из Ruby-приложения. Это очень важная веха, так как без усилий, которые вкладывает сам вендор платформы в конкретное направление, не получится говорить о том, что это направление является полноценным “жителем” экосистемы. Как и многие другие инструменты Microsoft, Ruby SDK — Open Source, и расположена на GitHub — github.com/WindowsAzure/azure-sdk-for-ruby
• Выход в свет IaaS в виде виртуальных машин. С этим все понятно – можно сделать под себя виртуальный сервер.
• Выход в свет хранилища образов VMDepot. Для тех, кто хочет получить готовый образ и начать работать сразу.
Способ 1: Windows Azure Linux-сервер, Ubuntu 12.04 LTS
Развернем вручную Linux-сервер и настроим под себя рабочую среду. Для этого перейдем на портал управления Windows 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 можно установить преднастроенные коммьюнити образы ВМ, и они будут автоматически развернуты и запущены на Windows Azure в вашем аккаунте.
Перейдем сразу на страницу необходимого образа.
Нажмем DEPLOYMENT SCRIPT для получения скрипта развертывания. Скрипт предназначен для Azure CLI, и, если у вас не установлен CLI, то воспользоваться им не получится (загрузить его можно по ссылке).
Запустите 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="http://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) и пронаблюдать результат по адресу localhost:81 (локальный эмулятор автоматически делает ремаппинг с 80 порта на 81 во избежание конфликтов).
Процесс дальнейшей разработки можно разбить на несколько этапов:
1) Создание программного кода и файлов .rb
2) Выполнение модификации файлов install.cmd и start.cmd, либо разработка новых исполняемых файлов, для автоматизации внесения изменений или создания совершенно нового окружения разработки и редактирование соответствующей секции в ServiceDefinitions.csdef
3) Внесение команд по управлению программным кодом в start.cmd
В данной заметке я кратко рассмотрел развертывание простейшей экосистемы для разработки на Ruby. Дальше выбор за вами – разрабатывать локально или иметь постоянно доступную среду разработки, с которой можно делать что угодно, и на которую можно зайти из любого места – по последним данным, это становится все более актуально.