9 January 2011

Управление облаками в Python

Python
Sandbox

Облака



Облачные вычисления стали популярными среди широких масс примерно полтора-два года назад, и огромную роль в этом сыграл сервис Amazon EC2. Постепенно активность обсуждений этой технологии только возрастала, появлялись сторонники и противники, считающие что это всего лишь очередное модное веяние и ничего больше; некоторые же стали экспериментировать и применять облачные вычисления для решения свох задач.

Довольно долго у EC2 было не много альтернатив, поэтому мало кто задумывался о проблемах миграции с одного клауд провайдера на другой. Однако, в последний год стало появляться все больше и больше компаний, предоставляющих клауд-сервисы адекватного качества по приемлемой цене.

На данный момент EC2, пожалуй, до сих пор остается лидером, однако появилось еще несколько крупных игроков — думаю, такие имена как Rackspace и GoGrid на слуху у всех, кто хотя бы поверхностно интересуется темой. Помимо них на рынке сейчас активны еще не меньше десятка компаний, предлагающих подобные услуги.

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

Зачем нужен libcloud?



Неотъемлемой частью клауд сервисов является наличие API, как правило RESTful или REST-like, который позволяет полностью контролировать клауд инфраструктуру. К сожалению, практически каждый провайдер создает свой API, несовместимый с уже существующими, что весьма неудобно, если вы решите перейти с одного сервиса на другой, и создает дополнительные сложности, если приходится поддерживать несколько разных сервисов одновременно.

Когда libcloud зарождался в компании Cloudkick (которую, кстати, совсем недавно купил Rackspace), цель была не только создать инструмент для работы с клаудами из Python, но и сформулировать видение того, каким должен (может) быть обобщенный интерфейс для работы с клаудами, как со стороны API сервисов, как и с клиентской стороны при работе с разными платформами. Например, параллельно с Python версией, развивается Java версия, принцип работы и концепции точно такие же.

Впрочем, не буду углубляться в философские аспекты, а продемонстрирую, что позволяет делать libcloud.

Приступаем к работе



Установка и настройка


Процесс установки вряд-ли покажется кому-нибудь новым:

easy_install apache-libcloud

Второй подготовительный этап — активировать API и получить ключ и пароль. Эта процедура отличается у различных клауд провайдеров и обычно описана у них в документации. Например, в случае ракспейса она выглядит так: зайти на manage.rackspacecloud.com, затем в меню Your Account -> API Access.

Терминология и интерфейс


В libcloud используется следующая терминология:

  • Нода — экземпляр одного виртуального сервера. У провайдеров обычно называется просто сервером
  • Размер ноды — физический размер ноды. Для разных провайдеров характеристики отличаются, обычно сюда включается размер оперативной памяти, количество ядер процессора, иногда размер дискового пространства
  • Образ ноды — образ операционной системы, которая используется для загрузки ноды


Над всеми вышеописанными объектами возможна операция list — получить актуальный список объектов. Для нод поддерживается больше операций: их можно создавать (create), удалять (destroy), а так же перегружать (reboot).

Просмотр доступных размеров и образов нод


Начнем с простого примера: подключимся к сервису и получим список всех образов с CentOS, а так же список всех возможных размеров нод:

#!/usr/bin/env python

from libcloud.types import Provider
from libcloud.providers import get_driver

from secret import access_id, secret_key

if __name__ == "__main__":
    Driver = get_driver(Provider.GOGRID)
    conn = Driver(access_id, secret_key)

    print "images: "
    for image in conn.list_images():
        if "CentOS" in image.name:
            print " %s %s" % (image.id, image.name)

    print "sizes: "
    for size in conn.list_sizes():
        print size


Для запуска потребуется создать файл «secret.py» и объявить там переменные access_id и secret_key с нужным пользователем и паролем для доступа к API вашего провейдера. Обратите внимание на строку:

Driver = get_driver(Provider.GOGRID)

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

pydoc libcloud.types.Provider

Создание и удаление нод


Рассмотрим пример создания и удаления ноды. Для создания нам нужно определиться с основными параметрами ноды, такими как имя, размер и образ. В качестве образа опять же выберем первый образ, содержащий в имени CentOS, и возьмем первый попавшийся размер.

#!/usr/bin/env python

from libcloud.types import Provider
from libcloud.providers import get_driver

from secret import access_id, secret_key

if __name__ == "__main__":
    Driver = get_driver(Provider.GOGRID)
    conn = Driver(access_id, secret_key)

    image = [image for image in conn.list_images() if
            "CentOS" in image.name][0]
    size = conn.list_sizes()[0]

    new_node = conn.create_node(name='mynode', image=image,
            size=size)

    print "node created: ", new_node

    new_node.destroy()


Заключение


Как видим, тут тоже все довольно просто и прозрачно; и двумя коротенькими скриптами удалось покрыть почти весь общий интерфейс. Конечно же, функционал libcloud'а на этом не ограничивается, и я не ставлю перед собой задачу составить подробное руководство по использованию, а лишь заинтересовать тех, кто только начинает работать с клаудами и, в особенности, тех людей, которые используют правайдер-специфичные библиотеки.

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

На этот случай libcloud поддерживает так называемые 'extra' методы в драйверах провайдеров, которые позволяют, например, создавать пары ssh ключей, создавать свои собственные образы нод и т.д. По моим наблюдениям, драйверы популярных провайдеров довольно хорошо покрывают весь функционал и оперативно обновляются. Информацию о том, что поддерживает каждый из драйверов, можно найти в документации API самого libcloud.

Надеюсь, libcloud упростит жизнь тем, кто работает с облаками, а моя статья поможет быстро сориентироваться в проекте.
Tags:облачные вычисленияоблачные технологииоблачный хостингlibcloudpython
Hubs: Python
+36
5.3k 53
Comments 9
Popular right now