JClouds的命令行界面

序言

我已经使用JCloud(一种面向Java支持多种云的工具集)一年了。到目前为止,我已经在很多领域广泛地使用了JCloud,特别是在Fuse Ecosystem上。虽然JCloud很厉害,但是它缺乏用来管理云提供商的工具,一个和EC2命令类似但有JCloud特点的工具,能够管理EC2,Rackspace,Opensack,CloudStack 等的通用工具。

我真的很高兴现在出现了这样一个工具,并且这个工具的第一个发行版本将要面世了。

所以这篇文章是对新出现的JCloud CLI(Command Line Interface)的介绍,它有两种风格:

  1. 交互模式(shell)
  2. 非交互模式(cli)

先看看历史

作为一个Karaf开发者,我在JCloud上做的第一件事情之一是在让JCloud支持OSGi(Java动态化模块化系统的一系列规范)。第二件事是将Apache Karaf集成到JCloud上。所以我开发了一个项目,使得在Karaf上安装JCloud非常简单,并且在Blob Store(微软的一种存储非机构化数据的技术)中添加了第一个基本命令,JClouds Karaf项目开始成形。与此同时,我的一位朋友和同事Guillaume Nodet也开始了一个类似的工作,这也为Jclouds Karaf做出了贡献。这个项目现在支持大部分的JClouds操作,提供了丰富的支持,使其真正快速和易于使用。

当然,这个集成项目大多是面向那些熟悉OSGi和Apache Karaf的人,不能被认为是一个通用工具,不像我在序幕中所梦想的那样。

几个月前,Andrew Bayer开始考虑建立一个通用的JClouds CLI。然后,这让我感到震惊:“ 为什么我们不继续JClouds Karaf的工作 来建立一个通用的CLI?

Apache Karaf最突出的一个特点是它名字很容易记住,而且由于它是模块化的,你可以为开发自己应用而很轻松地添加或移除某些功能模块。最重要的是,您可以在OSGi规范为开发和使用命令。

JClouds集成“ 开箱即用 ”,任何人都可以使用,而无需知道关于Karaf的任何内容,并且它既可以作为交互式Shell也可以作为CLI。由此看来,创建一个量身定制的Karaf似乎是一个好主意。JClouds CLI就在这里。

JClouds CLI入门

您可以从源代码构建CLI,或者下载tar包。提取它后,你会发现一个像这样的结构:

bin文件夹包含两个脚本:

  1. jclouds-cli:启动交互式shell。
  2. jcouds:通过其调用jclouds操作的脚本。

我们还以zip格式提供了Windows下的具有同样功能的bat文件。

我们看JClouds脚本,该脚本需要两个参数,多个选项和参数。一般用法是:

./jclouds [category] ​​[action] [options] [arguments]

Category:要使用的命令的类型。例如节点,组,图像,硬件,图像等。

Action:对类别执行的操作。例如:列表,创建,销毁,运行脚本,信息等

不管是计算服务还是Bolb Store操作,都需要服务提供商或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_为前缀,分别用于计算服务和Blob Store操作。所以--provider选项将匹配JCLOUDS_COMPUTE_PROVIDER用于计算服务或匹配JCLOUDS_BLOBSTORE_PROVIDER的用于Bolb Stores。

下图显示了为访问EC2,进行环境设置时,CLI的示例用法。这些命令在EC2上创建3个节点,然后将其全部销毁。

配置的环境变量是:

JCLOUDS_COMPUTE_PROVIDER aws-ec2

JCLOUDS_COMPUTE_IDENITY ????

JCLOUDS_COMPUTE_CREDENTIAL ???

当使用JClouds脚本时,JClouds支持的所有提供商将默认可用。通过将自定义jar放在系统文件夹下(最好使用像目录结构一样的maven),您可以添加自定义提供商和apis

使用交互式shell

JClouds CLI的第二种风格是交互式Shell。交互式Shell以类似的方式工作,但它也提供了额外的功能:

  • 服务可重用性
    • 服务一次性创建
    • 命令可以重用服务,从而缩短执行时间
  • 代码补全
    • 补全命令
    • 补全参数值和选项
  • 模块化
    • 允许你只安装需要的东西。
  • 扩展
    • 你可以添加你自己的命令。
    • 你可以添加额外的项目。
      • 例如:从Whirr 0.8.0起,您可以将其安装到任何基于Karaf的环境中。所以你也可以把它添加到CLI中。

在上面的例子中,我们为EC2创建了一个可重用的服务,然后我们执行了一个节点列表命令,显示了我们在前面的例子中创建和销毁的节点。

交互式Shell支持多个提供商的服务或apis

使用交互式Shell,您将可以使用不同的配置参数和帐户等,在多个提供商和api注册计算服务,或者在一个提供商和apis注册多个服务。

上面的图像显示了如何使用不同的配置参数在同一提供商创建多个服务。它还显示了在各种情况下如何指定服务的办法。再次提醒,在这个例子中,身份和提供者是作为环境变量提供的。

交互模式的模块化本质

上文提到,交互式Shell也是模块化的,允许您在运行时添加/删除模块。一个模块可以支持一个提供商或api,但是它可以是任何你需要的扩展类型。

交互模式下,查看可用提供程序和api的列表, 可以使用features:listfeatures:install命令。在下面的例子中,我们列出了所有功能并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

使用这样的配置,图像列表命令将产生以下输出:

我们可以修改上面的配置并添加一个额外的列,它将显示分配给当前硬件配置文件的卷。为了做到这一点,我们需要简单的了解jclouds硬件对象:

 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

GitHub上可以看到这个Gistgistfile1.txt 查看粗略版本

新配置将在EC2上产生以下输出:

你可以在Github上看到这个项目:http://github.com/jcloud/jcloud-cli。你也可以直接下载安装包:http://repo1.maven.org/maven2/org/jclouds/cli/jclouds-cli/1.5.0/

你可以在github上找到这个项目:https//github.com/jclouds/jclouds-cli。或者你也可以直接在http://repo1.maven.org/maven2/org/jclouds/cli/jclouds-cli/1.5.0/下载tarball。

本文的版权归 用户1191492 所有,如需转载请联系作者。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网技术栈

Dubbo作者聊 设计原则

转于自己在公司的Blog: http://pt.alibaba-inc.com/wp/experience_1301/code-detail.html

2394
来自专栏落影的专栏

iOS电商类APP的研发

前言 本文是研发一个在线超市的电商类APP过程中,对架构的整理。 ? 功能: 1、浏览商品、购买商品、切换商店; 2、查看订单、订单投诉、意见反馈; 3、...

71210
来自专栏小灰灰

Quick-Task 动态脚本支持框架之使用介绍篇

文章链接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-动态脚本支持框架之使用...

1142
来自专栏GopherCoder

『Go 语言学习专栏』-- 第十四期

1853
来自专栏py+selenium

py+selenium遇见IE,元素只有name属性【神奇解决】

IE8的问题:IE8不支持getElementByName,而属性中又没有ID,定位难度较大。

3441
来自专栏互联网开发者交流社区

Redis简介

1512
来自专栏小怪聊职场

IntelliJ IDEA神器使用技巧(基于Mac OS X 10.5+)

位置:菜单->File->Setting->Editor->Live Templates 举例:psvm 敲出 public static void main...

1414
来自专栏along的开发之旅

Android逆向分析概述

学习逆向的初衷是想系统学习Android下的hook技术和工具, 想系统学习Android的hook技术和工具是因为Android移动性能实战这本书. 这本书里...

1533
来自专栏芋道源码1024

从客户端的角度设计后端的接口

2.请求Path,http://www.online.com/api/ [path]

1483
来自专栏云计算

JClouds的命令行界面

我已经使用jclouds一年多了,也一直为它的进步做贡献。目前为止,我已经在很多领域广泛地使用它,特别是在 Fuse Ecosystem 。总之,它是一个特别棒...

2327

扫码关注云+社区