序
我已经使用jclouds一年多了,也一直为它的进步做贡献。目前为止,我已经在很多领域广泛地使用它,特别是在 Fuse Ecosystem 。总之,它是一个特别棒的工具,你可以用它来管理任何云供应商。用jclouds作为管理EC2的一个工具简直酷毙了。它是一个通用的工具,你能用它管理EC2,Rackspace,Opensack,CloudStack ...等等云服务。
我真的很高兴现在有这样一个工具,它的第一个版本已经完成(译者注:目前最新版本2.0.3,翻译这么老的文章做什么0.0)。
所以这篇文章是介绍一下新的(译者注:其实是多年前的)jclouds cli,它有两种风格:
想来点历史
作为一个 Karaf提交者,我在jclouds上做的第一件事情之一是在OSGi支持上工作。第二件事是为Apache Karaf进行jclouds集成。所以我开发了一个项目,使得在Karaf上安装jcloud非常简单,并且在blob商店中添加了第一条基本命令, Jclouds Karaf项目开始形成。与此同时,我的一位朋友兼同事 Guillaume Nodet也开始了类似的工作,为Jclouds Karaf做贡献 。这个项目现在已经支持大部分的jclouds操作,提供了完整丰富的支持,使其真正快速和易于使用。
当然,这个整合项目大多是针对那些熟悉OSGi和 Apache Karaf的人 ,不能被认为是一个通用工具,就像我在序幕中所梦想的那样。
几个月前, 安德鲁·拜耳 开始考虑建立一个通用的jclouds cli。然后,这让我感到震惊:“ 为什么我们不重复使用 Jclouds Karaf的工作 来建立一个通用的环境? ”
一个关于Apache Karaf的伟大事情发生啦—— 就是它很容易的成为品牌,而且由于它的模块化基础,你可以很容易地添加/删除位,以创建自己的分配。最重要的是,它允许您发现和使用OSGi以外的命令。
因此,创建一个量身定制的卡拉夫发行版似乎是一个好主意,jclouds集成“ 开箱即用 ”的特性,任何人都可以使用,而无需知道关于卡拉夫的任何内容,既可以作为交互式shell也可以作为cli。这里是: Jclouds CLI。
Jclouds CLI入门
您可以从源代码构建cli,或者下载tar球。一旦你提取它,你会发现一个像这样的结构:
bin文件夹包含两个脚本:
zip分发提供了Windows的等效bat文件。
我们从jclouds脚本开始。该脚本需要两个形参,多个选项和实参。一般用法是:
./jclouds [category] [action] [options] [arguments]
Category:要使用的命令的类型。例如节点,组,图像,硬件,图像等。
操作:对类别执行的操作。例如:列表,创建,销毁,运行脚本,信息等
不管是计算服务或blobstore的所有操作将需要提供者或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_为前缀, 分别用于计算服务和Blobstore操作。
所以--provider选项将匹配 JCLOUDS_COMPUTE_PROVIDER用于计算服务或 JCLOUDS_BLOBSTORE_PROVIDER的BLOB存储。
下图显示了访问EC2的环境设置中的cli的示例用法。这些命令在EC2上创建3个节点,然后将其全部销毁。
配置的环境变量是:
JCLOUDS_COMPUTE_PROVIDER aws-ec2
JCLOUDS_COMPUTE_IDENITY ???? (译者注:确实是问号,不是乱码)
JCLOUDS_COMPUTE_CREDENTIAL ???
当使用jclouds脚本时,jclouds支持的所有提供程序将默认可用。您可以添加自定义提供程序和apis,通过将自定义jar放在系统文件夹下 (最好使用像目录结构一样的maven)。使用交互式shell jclouds cli的第二种风格是交互式shell。交互式shell以类似的方式工作,但它也提供了额外的功能:
在上面的例子中,我们为EC2创建了一个可重用的服务,然后我们执行了一个节点列表,显示了我们在前面的例子中创建和销毁的节点。
将交互式shell与多个提供者或apis结合一起使用
使用交互式shell将允许您使用不同的配置参数,帐户等为相同的提供者或api为多个提供者和apis甚至多个服务注册计算服务。
上面的图像显示了如何使用不同的配置参数为同一提供者创建多个服务。它还显示了如何在指定每种情况下使用特定服务。特别强调,在这个例子中,身份和提供者没有通过,而是作为环境变量提供。
交互模式的模块化本质
如上所述,交互式外壳也是模块化的,允许您在运行时添加/删除模块。一个模块可以支持一个提供者或api,但是它可以是任何你需要的扩展类型。
要查看交互模式下可用提供程序和api的列表,可以使用以下 功能:列表和 功能:安装命令。在下面的例子中,我们列出了“ openstack ” 的功能和grep ,然后安装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
查看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/下载tarball。