Статьи

Интерфейс командной строки для 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


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

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

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

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

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

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



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

--provider aws-ec2 --identity [my identity] --credential [my credential] --add-option [some jclouds options]

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

     
./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, а затем уничтожают все из них.

Настроены переменные среды:
JCLOUDS_COMPUTE_PROVIDER aws-ec2
JCLOUDS_COMPUTE_IDENITY  ????
JCLOUDS_COMPUTE_CREDENTIAL  ???
При использовании скрипта jclouds все провайдеры, поддерживаемые jclouds, будут доступны по умолчанию. Вы можете добавить пользовательских провайдеров и apis, поместив пользовательские jar-файлы в системную папку
(предпочтительно используя структуру каталогов, похожую на maven). Использование интерактивной оболочки Вторым вариантом jclouds cli является интерактивная оболочка. Интерактивная оболочка работает аналогичным образом, но также предоставляет дополнительные функции:






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

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

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

Использование интерактивной оболочки с несколькими поставщиками или API-интерфейсом


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

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

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


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

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

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


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

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

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

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

#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 выдаст следующий вывод:

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

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} .

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

#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
view raw
gistfile1.txt
Этот Gist предоставлен вам
GitHub .

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

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