Управление виртуальными машинами с помощью средств API

Reduction_GearПанель Cloudstack предоставляет отличные средства по управлению виртуальными машинами в ручном режиме с помощью графического интерфейса пользователя. Данный механизм подходит для большинства случаев, когда виртуальная машина создается для продолжительного существования, однако, облако предоставляет Вам гораздо большие возможности. В этом цикле статей мы рассмотрим современный, иной подход к вычислениям, который позволит Вам создавать более гибкие и функциональные решения с использованием средств облачных вычислений.Весь маршрут цикла статей будет выглядеть следующим образом:

  • Программное управление выделением и удалением виртуальных машин (cloudmonkey);
  • Автоматизированное управление конфигурациями виртуальных машин (ansible, vagrant).

В этой статье мы рассмотрим как с помощью системы виртуализации Cloudstack возможно создавать и удалять виртуальные машины в автоматическом режиме с помощью API.

Традиционно, хостинг-провайдеры предлагают виртуальные машины на сроки от месяца, что согласуется с традиционными телематическими услугами, однако суть облачных услуг «доступность ресурса тогда, когда он нужен и освобождение сразу, как он больше не требуется» в данной модели не реализуется. Данный «облачный» подход принципиально меняет модель обслуживания клиентов, провоцируя использовать средства для горизонтального масштабирования и снижать степень «жесткой» связности систем. 

Цель

Сначала, перед тем как приступить к изложению, давайте определимся с модельными ситуациями и что мы хотим добиться. Допустим, что у нас имеется задача конвертирования видео, причем мы точно не знаем сколько видеозаписей и какой длины у нас будет. При этом мы хотим при поступлении видеозаписи выполнить конвертирование видео, для чего в традиционном подходе мы добавляли видео в очередь конвертирования, а в новом облачном подходе мы можем сделать следующие действия:

  1. создать виртуальную машину;
  2. установить на нее необходимые средства для конвертирования;
  3. загрузить видео на виртуальную машину;
  4. выполнить конвертирование;
  5. скачать видео с виртуальной машины;
  6. удалить виртуальную машину.

Для каждой видеозаписи мы будем выполнять данные действия. По этому поводу можно сделать три замечания:

  • пункт 2 можно опустить, внеся в начальный шаблон виртуальной машины необходимые программные средства, но здесь мы его рассмотрим для того, чтобы видеть полную картину;
  • во многих ситуациях пункты 2-5 могут многократно повторяться для каждой виртуальной машины, то есть нет необходимости каждый раз ее создавать и удалять. Создание и удаление новых экземпляров можно осуществлять при увеличении (росте) очереди или при увеличении времени обработки заявки (например, для HTTP сервера);
  • с точки зрения стоимости затрат нет никакой разница в том брать одну машину и добавлять видео в очередь или для каждого видео создавать экземпляр VM, где производить обработку (при условии быстрого создания VM), при этом второй подход обеспечивает большую производительность и уменьшает время ожидания.

Представленные выше шаги 1-6 позволяют реализовать масштабируемую обработку в самых различных областях, начиная от разработки и сборки ПО, заканчивая высокодоступными сервисами. Итак, начнем с того, что разберемся как осуществлять выделение и удаление виртуальных машин с помощью API Cloudstack. Cloudstack предоставляет RESTful API, которое обрабатывает запросы как в формате AWS так и в формате встроенного API. Мы будем использовать специальную утилиту Cloudmonkey, которая позволяет взаимодействовать с API упрощенно с помощью интерфейса командной строки. Для начала нам необходимо  установить Cloudmonkey. Мы будем рассматривать установку для OS Debian Linux.

# apt-get install python-pip
# pip install cloudmonkey

Больше нам права суперпользователя не потребуются. Первое, что необходимо сделать — настроить Cloudmonkey для взаимодействия с сервером Cloudstack. Для этого необходимо составить конфигурационный файл следующего вида:

[core]
cache_file = /home/user/.cloudmonkey/cache
log_file = /home/user/cloudmonkey_logs
asyncblock = true
paramcompletion = false
history_file = /home/user/cloudmonkey_history

[ui]
color = true
prompt = > 
display = 

[user]
secretkey = aa9AavyLs2xeR6NAj2E9ZwNMmfhvsrv1EtykaVcIIwVbd3NpivmzqRtOjZtD6tSU7BSrNNFA2-u_NYvIWBY_HB6g
username = bitworks1375
password = 
apikey = -xxFkwCHbo8KjIDf9S8NqH3SJQQcU-guTbSGTddsewGtryNSfYPytRzt6vdsdkgd7fdssb7eDly_G0RQ-dyWQ__gNW53ig

[server]
protocol = http
expires = 600
host = cs1.netpoint-dc.com
timeout = 3600
path = /client/api
port = 8080

и сохранить его как ~/.cloudmonkey/config. Давайте разберем содержимое конфигурационного файла. В секции [core] находятся глобальные настройки, которые Вы можете оставить неизменными, только измените пути хранения логов, кэша и истории на те, которые подходят Вам. В секции [ui] находятся настройки консоли cloudmonkey. Здесь интересен параметр display, который можно выставить как json, что позволит получать ответы не в форме key=value, а в форме json объекта, что может быть предпочтительнее. Однако, для ознакомительного этапа лучше всего оставить как есть, то есть в форме key=value. Color определяет будет ли вывод в цветном или черно-белом виде. В цветном симпатичнее, поэтому ставим как true. Секция [user] представляет для нас интерес. В качестве user указываем пользователя Cloudstack, пароль (password) оставим пустым. Теперь два поля secretkey и apikey, которые как раз отвечают за взаимодействие с API Cloudstack. Для того, чтобы получить эти строки необходимо сделать следующее: Воити в Cloudstack и перейти в учетные записи:Снимок экрана от 2014-07-03 12:20:57Далее выбираем учетную запись и переходим в Вид Пользователи:Снимок экрана от 2014-07-03 12:21:08Выбираем пользователя:Снимок экрана от 2014-07-03 12:21:23Генерируем для него ключи:Снимок экрана от 2014-07-03 12:21:33Копируем содержимое полей Ключ APIСекретный ключ в текстовый файл себе на компьютер. Данную информацию необходимо хранить в секрете и не передавать третьим лицам. При ее наличии возможно управлять всем функционалом Cloudstack вашего аккаунта, например, удалять виртуальные машины. Итак, ключи у нас есть, теперь можно указать их в конфигурационном файле Cloudmonkey (apikey, secretkey). Секция [server] тоже, на мой взгляд, очевидно, комментировать не буду. Проверяем Cloudmonkey в работе:

ivan@work-notebook:~/Загрузки$ cloudmonkey 

> sync
220 APIs discovered and cached

Команда sync определяет доступные вызовы API Cloudstack. Собственно ее вывод показывает, что соединение с Cloudstack прошло успешно. Теперь разберемся как создать виртуальную машину из шаблона. В данном примере будет использоваться представленный шаблон debian7-x64-10GB-lvm-passwd-RU. Для создания виртуальной машины нам потребуется узнать следующие данные:

  1. GUID шаблона;
  2. GUID предложения;
  3. GUID зоны.

Узнаем GUID шаблона:

> list templates templatefilter=featured | grep -B2 debian7-x64-10GB-lvm-passwd-RU================================================================================
id = fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8
name = debian7-x64-10GB-lvm-passwd-RU

Узнаем GUID зоны, в которой будет размещаться VM (у нас в настоящее время одна зона):

> list zones
count = 1
zone:
name = Zone 1 / No security
id = 860117f1-c815-4f0d-bb6f-04955f7de56f
allocationstate = Enabled
dhcpprovider = VirtualRouter
domain = z1.netpoint-dc.com
localstorageenabled = True
networktype = Basic
securitygroupsenabled = True
tags:
zonetoken = af4b4d69-d20b-3309-bf89-e5364efa8a6a

Теперь узнаем GUID вычислительного предложения, например, vm.large.sh:

> list serviceofferings | grep -F1 vm.large.sh
================================================================================
name = vm.large.sh
id = f49918d3-abe1-47b3-b9b6-53e9839d4fb4

Теперь у нас есть все необходимые данные для создания VM:

> deploy virtualmachine serviceofferingid=f49918d3-abe1-47b3-b9b6-53e9839d4fb4 templateid=fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8 zoneid=860117f1-c815-4f0d-bb6f-04955f7de56f
accountid = c5d977cb-cc82-45ec-9713-64b7396f2730
cmd = org.apache.cloudstack.api.command.user.vm.DeployVMCmd
created = 2014-07-03T16:47:51+0700
jobid = 6e93fa11-438d-4fbd-93e9-4a122df4f13a
jobprocstatus = 0
jobresult:
virtualmachine:
id = 10d388b3-8b30-4d0f-8c23-5587b37e2f06
name = VM-10d388b3-8b30-4d0f-8c23-5587b37e2f06
account = bitworks1375
affinitygroup:
cpunumber = 8
cpuspeed = 1000
created = 2014-07-03T16:47:51+0700
displayvm = True
domain = ROOT
domainid = 13627c9c-4922-11e3-bb87-0017087e602c
guestosid = 19dcfd2d-4922-11e3-bb87-0017087e602c
haenable = True
hypervisor = KVM
isdynamicallyscalable = False
jobid = 6e93fa11-438d-4fbd-93e9-4a122df4f13a
jobstatus = 0
memory = 8192
nic:
id = a669225b-3e19-4eef-b661-b266d7a09daf
broadcasturi = vlan://untagged
gateway = 176.120.25.1
ipaddress = 176.120.25.144
isdefault = True
isolationuri = ec2://untagged
macaddress = 06:09:e8:00:01:7a
netmask = 255.255.255.0
networkid = 4cfb157a-1805-43dc-a9f3-74726526ec6a
networkname = defaultGuestNetwork
traffictype = Guest
type = Shared
password = yI8qdsaan
passwordenabled = True
rootdeviceid = 0
rootdevicetype = ROOT
securitygroup:
serviceofferingid = f49918d3-abe1-47b3-b9b6-53e9839d4fb4
serviceofferingname = vm.large.sh
state = Running
tags:
templatedisplaytext = Debian7 x64 with password reset/LVM RU
templateid = fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8
templatename = debian7-x64-10GB-lvm-passwd-RU
zoneid = 860117f1-c815-4f0d-bb6f-04955f7de56f
zonename = Zone 1 / No security
jobresultcode = 0
jobresulttype = object
jobstatus = 1
userid = 1b6f676c-3e61-4ae5-a4f8-34443bfe901d

Все, виртуальная машина создана, теперь для создания VM типа (Debian7 x64/4C/4GB/10GB) вы можете просто использовать команду deploy:

$ cloudmonkey deploy virtualmachine serviceofferingid=f49918d3-abe1-47b3-b9b6-53e9839d4fb4 templateid=fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8 zoneid=860117f1-c815-4f0d-bb6f-04955f7de56f

Все, виртуальная машина создана, теперь для создания VM типа (Debian7 x64/4C/4GB/10GB) вы можете просто использовать команду deploy и создать столько VM, сколько Вам необходимо. Кстати, в команде deploy можно указать еще параметр name. Обратите внимание, что в ответе системы есть такие данные как ipaddresspassword, которые содержат IP и пароль для root к VM (в данном случае наш шаблон включает средства интеграции и пароль устанавливается в виртуальную машину панелью Cloudstack). Вторая часть процесса (шаг 6) — удаление VM. Выполняется оно достаточно просто:

> set color false
> list virtualmachines | egrep -EB1 '^name'
id = 9c45cffe-5f25-485a-a9e0-78c6228da85d
name = test
--
id = 10d388b3-8b30-4d0f-8c23-5587b37e2f06
name = VM-10d388b3-8b30-4d0f-8c23-5587b37e2f06

Получили идентификаторы VM, можно удалять:

> destroy virtualmachine id=10d388b3-8b30-4d0f-8c23-5587b37e2f06

cmd = org.apache.cloudstack.api.command.user.vm.DestroyVMCmd
created = 2014-07-03T17:00:51+0700
jobid = 9f48eacc-8a73-4cbe-ba40-d75a6b669024
jobprocstatus = 0
jobresult:
virtualmachine:
id = 10d388b3-8b30-4d0f-8c23-5587b37e2f06
name = VM-10d388b3-8b30-4d0f-8c23-5587b37e2f06
account = bitworks1375
affinitygroup:
cpunumber = 8
cpuspeed = 1000
cpuused = 0,01%
created = 2014-07-03T16:47:51+0700
diskioread = 11
diskiowrite = 106
diskkbsread = 68
diskkbswrite = 684
displayvm = True
domain = ROOT
domainid = 13627c9c-4922-11e3-bb87-0017087e602c
guestosid = 19dcfd2d-4922-11e3-bb87-0017087e602c
haenable = True
hypervisor = KVM
isdynamicallyscalable = False
jobid = 9f48eacc-8a73-4cbe-ba40-d75a6b669024
jobstatus = 0
memory = 8192
networkkbsread = 103
networkkbswrite = 5
nic:
id = a669225b-3e19-4eef-b661-b266d7a09daf
broadcasturi = vlan://untagged
gateway = 176.120.25.1
ipaddress = 176.120.25.144
isdefault = True
isolationuri = ec2://untagged
macaddress = 06:09:e8:00:01:7a
netmask = 255.255.255.0
networkid = 4cfb157a-1805-43dc-a9f3-74726526ec6a
networkname = defaultGuestNetwork
traffictype = Guest
type = Shared
passwordenabled = True
rootdeviceid = 0
rootdevicetype = ROOT
securitygroup:
serviceofferingid = f49918d3-abe1-47b3-b9b6-53e9839d4fb4
serviceofferingname = vm.large.sh
state = Destroyed
tags:
templatedisplaytext = Debian7 x64 with password reset/LVM RU
templateid = fe9f83ef-6e8c-42e6-b0a0-8942a621fcb8
templatename = debian7-x64-10GB-lvm-passwd-RU
zoneid = 860117f1-c815-4f0d-bb6f-04955f7de56f
zonename = Zone 1 / No security
jobresultcode = 0
jobresulttype = object
jobstatus = 1
userid = 1b6f676c-3e61-4ae5-a4f8-34443bfe901d

Все, на этом виртуальная машина удалена. В следующей части мы разберемся с тем, как взаимодействовать с вновь созданной VM с помощью SSH и ключей PKI.

Вторая часть статьи