JClouds的命令行界面

Screen Shot 2012-07-14 at 7.54.36 μ.μ..png

我已经使用jclouds一年多了,也一直为它的进步做贡献。目前为止,我已经在很多领域广泛地使用它,特别是在 Fuse Ecosystem 。总之,它是一个特别棒的工具,你可以用它来管理任何云供应商。用jclouds作为管理EC2的一个工具简直酷毙了。它是一个通用的工具,你能用它管理EC2,Rackspace,Opensack,CloudStack ...等等云服务。

我真的很高兴现在有这样一个工具,它的第一个版本已经完成(译者注:目前最新版本2.0.3,翻译这么老的文章做什么0.0)。

所以这篇文章是介绍一下新的(译者注:其实是多年前的)jclouds cli,它有两种风格:

  1. 交互模式(shell)
  2. 非交互模式(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文件夹包含两个脚本:

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

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以类似的方式工作,但它也提供了额外的功能:

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

在上面的例子中,我们为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。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大魏分享(微信公众号:david-share)

Java学习笔记第一篇:坦克大战游戏

一、Java学习笔记系列 笔者大学时候学的编程语言是C和汇编,毕业以后并未从事过开发工作,也没有接触过Java。但近两年的PaaS、CI/CD主要是以Java应...

5625
来自专栏aCloudDeveloper

Linux探秘之I/O效率

一、文章来由   最近看了《UNIX环境高级编程》,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对...

2257
来自专栏阮一峰的网络日志

处理Apache日志的Bash脚本

去年一年,我写了将近100篇网络日志。 现在这一年结束了,我要统计"访问量排名",看看哪些文章最受欢迎。(隆重预告:本文结尾处将揭晓前5名。) ? 以往,我用的...

3605
来自专栏涤生的博客

天池中间件大赛——单机百万消息队列存储设计与实现

这次天池中间件性能大赛初赛和复赛的成绩都正好是第五名,本次整理了复赛《单机百万消息队列的存储设计》的思路方案分享给大家,实现方案上也是决赛队伍中相对比较特别的。

1841
来自专栏Python爬虫与数据挖掘

网络爬虫过程中5种网页去重方法简要介绍

一般的,我们想抓取一个网站所有的URL,首先通过起始URL,之后通过网络爬虫提取出该网页中所有的URL链接,之后再对提取出来的每个URL进行爬取,提取出...

741
来自专栏杨建荣的学习笔记

如果理解Python web开发技术

首先来问一个问题,如何来看待Python web开发技术?如果不知道如何回答,我们换个问题:如何理解Python web的本质,这个我先用了三个程序来说明。 首...

3754
来自专栏Java帮帮-微信公众号-技术文章全总结

大文件拆分方案的Java实践【面试+工作】

大文件拆分问题涉及到io处理、并发编程、生产者/消费者模式的理解,是一个很好的综合应用场景,为此,花点时间做一些实践,对相关的知识做一次梳理和集成,总结一些共性...

2314
来自专栏Danny的专栏

【项目实战】——Java实现伪静态——urlrewrite

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1644
来自专栏互联网技术栈

Dubbo作者聊 设计原则

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

2394
来自专栏黑白安全

PHP代码审计入门之路

虽然市面上的代码审计的文章已经一大把了,但是还是决定重复造轮子,打算作为一个系列来写的,近年越来越多的安全研究人员投入到php应用的漏洞挖掘,相对应的代码安全问...

932

扫码关注云+社区