前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JClouds的命令行界面

JClouds的命令行界面

作者头像
用户1191492
修改2018-01-12 19:24:03
2K0
修改2018-01-12 19:24:03
举报

序言

我已经使用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/

你可以在
评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 序言
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档