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

Облака



Облачные вычисления стали популярными среди широких масс примерно полтора-два года назад, и огромную роль в этом сыграл сервис 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 упростит жизнь тем, кто работает с облаками, а моя статья поможет быстро сориентироваться в проекте.

Комментарии 9

    –1
    Мне кажется у вас неполадки с заголовками. Исправьте, пожалуйста.
      –1
      Что неправильно с заголовками? Использовал обычные h4 для внешних и h5 для внутренник заголовков.
        +1
        Нет, я о том, что тогда вторая половина статьи была помечена как заголовок и была трудночитаема, теперь все в порядке.
      0
      «Облачные выч_И_сления стали популярными среди широких масс...» — проверочное слово чИсло. :)
        +1
        Исправил, спасибо. Извиняюсь, не вычитал как следует статью и не воспользовался spell-checker'ом.
        0
        «хотя бы поверностно интересуется..» Исправьте.
        Вцелом интересная статья. Почитал бы еще с удовольствием на тему «Python и облачка»!
        Спасибо!
          0
          Спасибо, исправил.
          Что именно интересно почитать на тему «питон и облака»? На мой взгляд, довольно трудно найти довольно общую тему, которая охватывает питон и клауды. Возможно, к таким темам можно отнести использование fabric, и, отчасти, paramiko, все остальное уже, пожалуй, будет ориентировано на конкретные задачи и технологии.
            0
            Можно, к примеру, написать топик о реальном применении описанной Вами библиотеки с описанием параметров хостинга, либо другие возможности libcloud. Если есть аналогичные библиотеки для Питона сделать для каждой краткий обзор.
            Признаюсь честно, не работал с облачными вычислениями, но тема интересная для меня, особенно когда есть поддержка для Питона!
          –1
          Квинтэссенция новогодней статьи на хабре.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое