Статьи

Интерфейс командной строки для jclouds

пролог

Я использую и участвую в jclouds уже больше года. До сих пор я широко использовал его во многих областях, особенно в экосистеме плавких предохранителей . При всей своей удивительности ему не хватало одной вещи — инструмента, который вы можете использовать для управления любым облачным провайдером, к которому jclouds также предоставляет доступ. Что-то вроде командного инструмента EC2, но с крутостью jclouds. Обычный инструмент, с помощью которого вы сможете управлять EC2, Rackspace, Opesntack, CloudStack … вы называете это.

Я очень рад, что теперь есть такой инструмент, и его первый выпуск находится на пороге.

Итак, этот пост представляет собой введение в новый jclouds cli, который представлен в двух вариантах:

  1. Интерактивный режим (оболочка)
  2. Неинтерактивный режим (cli)

Немного истории

Будучи коммиттером Karaf, одним из первых, что я сделал в отношении jclouds, была работа над поддержкой OSGi. Второе — работа над интеграцией jclouds для Apache Karaf . Поэтому я работал над проектом, который действительно облегчил установку jclouds поверх Karaf, и добавил первые базовые команды для хранилищ больших двоичных объектов, и проект Jclouds Karaf начал обретать форму. В то же время мой друг и коллега, Гийом Ноде, начал аналогичную работу, которую он внес в Jclouds Karaf . Этот проект теперь поддерживает большинство операций jclouds, предоставляет богатую поддержку завершения, что делает его действительно быстрым и простым в использовании.

Конечно, этот интеграционный проект в основном нацелен на людей, которые знакомы с OSGi и Apache Karaf и не могут рассматриваться как инструмент общего назначения, как тот, о котором я мечтал в прологе.

Пару месяцев назад Эндрю Байер начал задумываться о создании универсального jclouds cli. Затем меня поразило : « Почему бы нам не использовать работу, проделанную над Jclouds Karaf, для создания общего назначения? »

Одна из замечательных особенностей Apache Karaf заключается в том, что он легко маркируется и благодаря его модульной основе вы можете довольно легко добавлять / удалять биты для создания своего собственного дистрибутива. Кроме того, он позволяет вам находить и использовать команды вне OSGi.

Таким образом, казалось хорошей идеей создать индивидуальный дистрибутив Karaf с интеграцией jclouds « из коробки », который мог бы быть использован любым человеком без необходимости знать что-либо о Karaf, как в виде интерактивной оболочки, так и в качестве клиента. И вот оно: Jclouds CLI .

Начало работы с Jclouds CLI

Вы можете либо собрать cli из исходного кода, либо скачать tar-шар. После того, как вы извлечете его, вы найдете такую ​​структуру:

Снимок экрана 2012-07-14 при 7,54,36 мкм.

Папка bin содержит два скрипта:

  1. jclouds-cli : запускает интерактивную оболочку.
  2. jcouds: скрипт, через который вы вызываете операции jclouds.

Распределение почтового индекса предоставляет эквивалентные файлы летучей мыши для окон.

Давайте начнем со скрипта jclouds. Сценарий принимает два параметра, несколько параметров и аргументы. Общее использование:

./jclouds [категория] [действие] [опции] [аргументы]

  • Категория: тип команды для использования. Например, узел, группа, образ, оборудование, образ и т. Д.
  • Действие: действие, которое нужно выполнить с категорией. Например: список, создание, уничтожение, запуск сценария, информация и т. Д.

Все операции, связанные с обслуживанием вычислений или хранилищем данных, потребуют поставщика или API и действительные учетные данные для этого поставщика / API. Все это может быть указано в качестве опции для команды. Например, чтобы вывести список всех работающих узлов на Amazon EC2:

1
/jclouds node list --provider aws-ec2 --identity [my identity] --credential [my credential] --add-option [some jclouds options]

Для apis вам также нужно указать конечную точку, например, та же операция для Cloudstack может быть:

1
./jclouds node list --api cloudstack --identity [my identity] --credential [my credential] --endpoint http://localhost:8080/client/api

Конечно, вы можете не захотеть указывать одни и те же параметры снова и снова. В этом случае вы можете просто указать их как переменные среды. Имя переменной всегда пишется заглавными буквами и начинается с префикса JCLOUDS_COMPUTE_ или JCLOUDS_BLOBSTORE_ для операций вычислительного сервиса и хранилища больших двоичных объектов соответственно. Таким образом, параметр –provider будет соответствовать JCLOUDS_COMPUTE_PROVIDER для службы вычислений или JCLOUDS_BLOBSTORE_PROVIDER для хранилищ больших двоичных объектов .

На рисунке ниже показан пример использования cli в настройках среды для доступа к EC2. Команды создают 3 узла в EC2, а затем уничтожают все из них.

Снимок экрана 2012-09-06 в 10.59.06 π.μ.

Настроенные переменные среды:

  • JCLOUDS_COMPUTE_PROVIDER aws-ec2
  • JCLOUDS_COMPUTE_IDENITY ????
  • JCLOUDS_COMPUTE_CREDENTIAL ???

При использовании скрипта jclouds все провайдеры, поддерживаемые jclouds, будут доступны по умолчанию. Вы можете добавить пользовательских провайдеров и apis, поместив пользовательские jar-файлы в системную папку (предпочтительно используя структуру каталогов, похожую на maven).

Использование интерактивной оболочки

Вторым вариантом jclouds cli является интерактивная оболочка. Интерактивная оболочка работает аналогичным образом, но также предоставляет дополнительные функции:

  • Повторное использование услуг
    • Сервисы создаются один раз
    • Команды могут повторно использовать службы, что приводит к ускорению выполнения.
  • Завершение кода
    • Завершение команд
    • Завершение значений аргументов и опций
  • модульность
    • Позволяет устанавливать только то, что вам нужно.
  • растяжимый
    • Вы можете добавить свои собственные команды.
    • Вы можете дополнительный проект.
      • Пример: Начиная с Whirr 0.8.0, вы можете установить его в любую среду на базе Karaf. Таким образом, вы можете добавить его в Cli.

Снимок экрана 2012-09-06 в 11.07.03 №.

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

Использование интерактивной оболочки с несколькими провайдерами или apis

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

Снимок экрана 2012-09-18 при 7,34,14 мкм.

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

Модульная природа интерактивного режима

Как уже упоминалось выше, интерактивная оболочка также является модульной, что позволяет добавлять / удалять модули во время выполнения. Модуль может быть поддержкой для провайдера или API, но это может быть расширение любого типа, которое вам может понадобиться.

Чтобы просмотреть список доступных провайдеров и API-интерфейсы, которые можно использовать в интерактивном режиме, вы можете использовать команды : список и функции: установить . В приведенном ниже примере мы перечисляем функции и grep для « openstack », а затем устанавливаем jclouds openstack-nova api. Затем мы создаем для него сервис и перечисляем узлы в нашем openstack.

Снимок экрана 2012-09-18 при 8,47,07 мкм.

Настройка вывода команды

Изначально выходные данные команды были разработаны и отформатированы с использованием наиболее распространенных поставщиков облачных вычислений в качестве руководства. Однако результат был не оптимальным для всех провайдеров (разной ширины и т. Д.). Более того, разные пользователи нуждались в отображении разных вещей.

Чтобы решить эту проблему, cli использует вывод команд в виде таблиц с автоматически настраиваемыми размерами столбцов, которые наилучшим образом соответствуют выводу команды. Также вывод команд полностью настраивается.

Каждый экземпляр таблицы передает данные дисплея в виде коллекции, представляющей строки таблицы. Заголовки столбцов считываются из файла конфигурации. Фактическое значение для каждой ячейки вычисляется с использованием выражений сценария JSR-233 (по умолчанию используется groovy), которые применяются для каждой строки и столбца. Наконец, таблица поддерживает сортировку по столбцам.

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

01
02
03
04
05
06
07
08
09
10
11
12
#The column headers
hardware.headers=[id];[ram];[cpu];[cores]
 
#Groovy expressions for displaying id, ram, sum of (cores X speed) for each proceessor, sum of cores.
hardware.expressions=hardware.id;hardware.ram;hardware.processors.sum{it.cores*it.speed};hardware.processors.sum{it.cores}
 
#Cell alignments. We prefer numbers to be right aligned.
hardware.alignments=left;right;right;right
 
#Sort by the [cpu] column in descending order
hardware.shortby=[cpu]
hardware.ascending=true

С этой конфигурацией команда image list выдаст следующий вывод:

Снимок экрана 2012-09-18 в 11.03.56 мкм.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public interface Hardware extends ComputeMetadata {   
   List<? extends Processor> getProcessors();
   int getRam();
   List<? extends Volume> getVolumes();
   Predicate<Image> supportsImage();
}
 
public interface Volume {
   String getId();
   Type getType();
   Float getSize();
   String getDevice();
   boolean isDurable();
   boolean isBootDevice();
 
}

Таким образом, чтобы получить весь размер тома и тип тома, мы можем использовать следующее выражение для аппаратного объекта: hardware.volumes.collect {it.size + «GB» + it.type} .

Обновленная конфигурация будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
#The column headers
hardware.headers=[id];[ram];[cpu];[cores];[volumes]
 
#Groovy expressions for displaying id, ram, sum of (cores X speed) for each proceessor, sum of cores.
hardware.expressions=hardware.id;hardware.ram;hardware.processors.sum{it.cores*it.speed};hardware.processors.sum{it.cores};hardware.volumes.collect{it.size + "GB " + it.type}
 
#Cell alignments. We prefer numbers to be right aligned.
hardware.alignments=left;right;right;right;left
 
#Sort by the [cpu] column in descending order
hardware.shortby=[cpu]
hardware.ascending=true

Новая конфигурация выдаст следующий вывод на EC2:

Снимок экрана 2012-09-18 в 9.39,57 мкм.

Вы можете найти проект на github: https://github.com/jclouds/jclouds-cli . Или вы можете напрямую загрузить архивы по адресу: http://repo1.maven.org/maven2/org/jclouds/cli/jclouds-cli/1.5.0/