内容


IBM PureApplication System 中的脚本编写

Comments

简介

PureApplication System 命令行接口 (CLI) 工具提供了一个脚本环境,在该环境中,可以运行命令来远程管理 PureApplication System。您还可以运行 Python 脚本或单个 Python 命令。该脚本环境基于 Jython,Jython 是基于 Java 的 Python 实现。Jython 解释器实现了一些 Python 2.5.1 语言。CLI 使用了 Jython 解释器,以及一些标准 Jython 库、函数和类,帮助您管理您的 PureApplication System 环境。

除了基于 Jython 的脚本环境之外,PureApplication System 还提供了一个 REST API,使您能够用任何编程语言来编写脚本。

入门

在开始之前,请转到 PureApplication System 知识中心并标记以下两个主题:

您可以从 PureApplication SystemI 的欢迎页面下载 PureCLI。图 1 显示了下载屏幕:

图 1. 下载 CLI
下载 CLI
下载 CLI

下载文件是一个 zip 文件,所以应该将其解压到一个目录中,比如 /purecli。清单 1 显示了 PureCLI 安装中的一个示例目录结构:

清单 1. PureCLI 目录结构
├── bin
│  ├── 2.0.0.0-201409151314631
│  └── 2.0.0.1-201411251434417
├── lib
│  ├── 2.0.0.0-201409151314631
│ │  ├── admin
│ │ │  ├── resources
│ │ │  ├── settings
│ │ │  └── troubleshooting
│ │  ├── deployer
│ │ │  ├── messages
│ │ │ │  └── ext
│ │ │  ├── resources
│ │ │  └── settings
│ │  └── utility
│  └── 2.0.0.1-201411251434417
│      ├── admin
│      │  ├── resources
│      │  ├── settings
│      │  └── troubleshooting
│      ├── deployer
│      │  ├── messages
│      │ │  └── ext
│      │  ├── resources
│      │  └── settings
│      └── utility
├── logs
└── samplesCODE

bin 和 lib 目录有针对以下两个版本的的子目录:2.0.0.0 和 2.0.0.1。如果检测到 IBM PureApplication System 中有新版本,PureCLI 会自动更新到新版本。

Hello World 示例

PureCLI 相当于一个 Hello World 示例,它从命令行访问 PureApplication System。转到 bin 目录,并执行 pure(如果在 Windows® 上,则执行 pure.bat)。它会给您提供结果,如清单 2 所示:

清单 2. 执行 pure
    pure -h [HOST] -u [USER] -p [PASSWORD]
    pure -h [HOST] -u [USER] -p [PASSWORD] -c [COMMAND]
    pure -h [HOST] -u [USER] -p [PASSWORD] -f [SCRIPT_FILE] [ARG]*

验证主机名或 IP 地址是正确的,运行 CLI 命令的机器应该建立了到端口 443 的网络连接。使用正确的主机和凭证修改命令行,然后再执行该命令,您会得到清单 3 中的输出:

清单 3. 连接到 PureApplication System
Welcome to the IBM PureApplication System CLI.  Enter "help" if you need help getting started.
>>>

请输入 help 命令来获得入门帮助。清单 4 显示了一个帮助信息的摘录:

清单 4. 帮助信息的摘录
In addition to the standard Jython libraries, the CLI provides a rich set of functions and classes
in the admin and deployer packages to help you manage your system.  More extensive help is available
for the deployer and admin packages by entering:
   >>> help(deployer)
   >>> help(admin)

现在,您可以开始使用 PureCLI 做一些实际的工作了。

使用 PureCLI

在上面一节中,您可以交互式地使用 PureCLI。在将测试命令放入一个文件之前,在交互模式下使用测试命令,并获得 PureCLI 命令的帮助信息。例如,要发现您的 PureApplication System 中有多少个计算节点,可以使用以下命令:

  • 输入 help(admin) 获得关于可用函数的帮助信息。您可以看到称为 admin.computenodes 的函数。
  • 执行 admin.computenodes 获得关于计算节点的 JSON 格式化对象的列表。
  • 要获得计算节点的总数,请输入 len(admin.computenodes)。系统会返回数字 6。这意味着您在 PureApplication System 中有 6 个计算节点。

作为典型输出的一个示例,清单 5 显示了单个计算节点的一个 JSON 对象:

清单 5. 计算节点的 JSON 对象
{
  "acl": (nested object),
  "architecture": "10X",
  "cloud": (nested object),
  "energystats": (nested object),
  "firmwarelevel": "1AOO56G",
  "healthstats": (nested object),
  "id": "176bc2b8-a41c-4468-9236-cb1f62dcac64",
  "leds": (nested object),
  "locations": (nested object),
  "machinetype": "7863",
  "name": "SN#10B4E6B",
  "numberofpowercycles": 3,
  "physicalcpus": (nested object),
  "physicalioadapters": (nested object),
  "physicalmemory": (nested object),
  "powerstate": "powered_on",
  "pvuvalue": 70,
  "state": "available",
  "vios": (nested object),
  "virtualmachines": (nested object)
}

许多属性都使用 (nested object) 作为一个值。要获得嵌套对象的 JSON 对象,只需在函数调用中输入属性名称。例如,要获得第一个计算节点的所有虚拟机,可以输入以下命令:admin.computenodes[0].virtualmachines

有许多可在 PureCLI 中使用的对象和函数,而且您可以从命令行控制所有 PureApplication System,无需使用浏览器 GUI。

如清单 2 中所示,您可以对 PureCLI 执行脚本文件,这就是通常使用 CLI 的方式。交互式 PureCLI 是一个了解和测试您获得所需信息的各种方式的好方法,当您知道自己需要什么时,您可以将命令放入一个脚本中。

管理工作负载

工作负载是运行在 PureApplication System 中的某个模式的一个实例。模式是 PureApplication System 的关键技术之一,而且模式是应用程序的完整架构。使用 PureCLI,您可以从命令行部署和管理模式,您可以编写脚本,自动化部署任务和其他相关任务。

PureCLI 命令 help(deployer) 提供了一些可用函数来管理工作负载。以下小节提供了一个使用 PureCLI 的示例。

部署一个模式

使用 PureCLI 脚本的一个现实生活示例是:部署一个模式并查看部署状态。清单 6 显示了一个脚本,您可以使用它来部署模式。清单 7 显示了部署状态。

清单 6 中的部署脚本接受两个命令行参数:pattern nameenvironment profile name。两个参数都是部署模式所必需的。在开始部署时,虚拟实例 ID 被打印到控制台,并保存到文件中供以后使用。

清单 6. 部署一个模式
import sys
import time
import os

if len(sys.argv)!=3:
  print "Usage: %s <pattern name> <environment profile name>"
  exit(1)

#pattern name and env profile name as arguments
patternName=sys.argv[1]
envProfileName=sys.argv[2]
ctime=time.strftime("%H%M%S")
print "Deploying pattern '%s' to profile '%s'..." %  \
  (patternName,envProfileName)
#retrieve pattern and environment profile objects from PureApplication
#based on given names
mypattern=deployer.virtualsystempatterns.list({"app_name": patternName})[0]
envprofile=deployer.environmentprofiles.list({'name':envProfileName})[0]
deploymentParams={
  'environment_profile':envprofile
}
#initiate deployment
virtualInstance=mypattern.deploy("%s %s" %
                                (patternName,ctime),deploymentParams)
#get instance ID
virtualInstanceID=virtualInstance.id
#print out ID and save ID to a file, for later use
print "Pattern %s is deploying. ID: %s" % (patternName,virtualInstanceID)
f=open("virtualInstanceID","w")
f.write(virtualInstanceID)
f.close()

在开始部署后,您可以使用清单 7 中的脚本查看部署状态:

清单 7. 获得部署状态
import sys
import time
import os

if len(sys.argv)==2:
  #read virtual instance id from command line
  virtualInstanceID=sys.argv[1]
else:
  #read id from a file
  f=open("virtualInstanceID","r")
  virtualInstanceID=f.read().strip()
  f.close()
#get instance
instances=deployer.virtualsysteminstances.list({'id':virtualInstanceID})
if len(instances)==0:
  print "Instance %s does not exist." % (virtualInstanceID)
else:
  instance=instances[0]
  #print deployment history
  history=instance.history
  for line in history:
    print "%s: %s" % (line['created_time'],line['current_message'])
  name=instance.deployment_name
  status=instance.status
  print 'Instance "%s"... %s' % (name,status)
  if status=="RUNNING":
    #list virtual machines
    print 'Virtual machines:'
    virtualmachines=instance.virtualmachines
    for vm in virtualmachines:
      name=vm.displayname
      ip=vm.ip
      hostname=ip.userhostname
      ipaddr=ip.ipaddress
      print "  %s (%s): %s" % (hostname,ipaddr,name)

该脚本从用清单 6 中的部署脚本编写的一个文件中读取虚拟实例 ID。您还可以提供虚拟实例 ID 作为一个命令行参数。该 ID 用于获得实例对象,该脚本会打印出部署历史记录。如果实例正在运行,那么该脚本会显示每个虚拟系统实例中的每个虚拟机的名称、主机名和 IP 地址。清单 8 显示了一个部署状态示例:

清单 8. 部署状态
2015-03-23T08:56:27.047Z: Deployment has been queued
2015-03-23T08:56:30.058Z: Reserving cloud resources
2015-03-23T08:56:32.528Z: Generating model for topology and network
2015-03-23T08:56:37.408Z: Pattern deployment starting
2015-03-23T08:56:38.398Z: Registering virtual system sjs Base OS 105502
2015-03-23T08:58:40.275Z: Added new disk for virtual machine OS_Node.11427100964512 of size 20 GB
2015-03-23T08:58:40.876Z: Starting virtual machines in virtual system sjs Base OS 105502
2015-03-23T08:58:40.898Z: Starting virtual machine OS_Node.11427100964512
2015-03-23T08:59:52.763Z: Executing script packages
2015-03-23T09:00:08.451Z: 
     Executing script package Default add disk on virtual machine OS_Node.11427100964512
2015-03-23T09:00:17.143Z: 
     Script package Default add disk on virtual machine OS_Node.11427100964512 completed successfully
2015-03-23T09:00:17.299Z: 
     Executing script package Must Gather Logs on virtual machine OS_Node.11427100964512
2015-03-23T09:00:22.378Z: 
     Script package Must Gather Logs on virtual machine OS_Node.11427100964512 completed successfully
2015-03-23T09:00:23.053Z: 
     Virtual machines are ready
Instance "sjs Base OS 105502"... RUNNING
Virtual machines: ipas3-cg1-vm27.stgt.spc.ihost.com (172.17.63.27): OS_Node.11427100964512

如果您愿意的话,可以使用以下命令删除正在运行的实例:deployer.virtualsysteminstances.delete(virtualInstanceID)

使用 REST API

PureCLI 非常有用,REST API 更加有用,事实上,PureCLI 自身也在使用 REST API。要使用 REST API,不必下载任何东西,可以使用 curl 从命令行开始使用它,或者使用您最喜欢的编程语言。清单 9 显示了如何使用 curl 命令访问 REST API:

清单 9. 使用 curl 访问 PureApplication System
curl --cacert <IPASHOSTORIP> -k -H "X-IBM-PureSystem-API-Version: 1.0" 
-H "Accept: application/json" --user <UID>:<PWD> https://<IPASHOSTORIP><RESTPATH>

IPASHOSTORIP 是 PureApplication System 的地址,UID 和 PWD 是自说明的,RESTPATH 是资源路径。

列出共享的服务

REST API 的一个明显用例是:在您需要的时候,在 PureCLI 中获得您想要的东西并不容易,比如共享的服务实例的清单,它们使用了多少内存和 CPU。

来自 REST API 的输出是 JSON。如果您使用 Python 来编写脚本,simplejson 模块会将 JSON 字符串转换为易于使用的 Python 对象。

清单 10 显示了一个脚本,该脚本使用一个 REST API 调用列出了共享的服务。该脚本包含一个 Python 包装器来实现 curl,可以使用常用 Python 解释器来执行它,不需要使用 PureCLI:

清单 10. 使用 REST API 获得共享的服务实例
import sys
import time
import os
import simplejson

if len(sys.argv)!=4:
  print "Usage: %s <ip address> <uid> <pwd>" % sys.argv[0]
  exit(1)

pureappIPAddress=sys.argv[1]
uid=sys.argv[2]
password=sys.argv[3]

#call REST API using curl and return JSON
def callREST(path):
  cmd=["curl","--cacert",pureappIPAddress,"https://%s%s" %
     (pureappIPAddress,path),  
     "-k","-H",'"X-IBM-PureSystem-API-Version: 1.0"',
     "-H",'"Accept: application/json"', "--user"," %s:%s" % (uid,password)]
  cmd= " ".join(cmd)
  fname="output.json"
  rc= os.system(cmd+" > "+fname+" 2> err_output.txt")
  outputfile=open(fname,'r')
  jsonStr=outputfile.read()
  outputfile.close()
  json = simplejson.loads(jsonStr)
  if rc != 0:
    print "some error happened: %d" % rc
  return json

path="/resources/sharedServices/"
json=callREST(path)
print "Available services:"
alreadyPrinted=[]
for svc in json:
  name=svc["app_name"]
  if name not in alreadyPrinted:
    print "  %s" % (name)
    alreadyPrinted.append(name)
path="/resources/sharedServiceInstances/"
json=callREST(path)
print "Deployments:"
totalramforsvc=0
totalcpuforsvc=0
for svc in json:
  print "  Name: %s" % svc["deployment_name"]
  totalram=0
  totalcpu=0
  for instance in svc["instances"]:
    ram=instance["memory"]
    totalram=totalram+ram
    vcpu=instance["cpucount"]
    totalcpu=totalcpu+vcpu
    cloudgroup=instance["location"]["cloud_group"]["name"]
    print "    %s (RAM: %d MB, vCPU: %d) %s" %
          (instance["displayname"],ram,vcpu,cloudgroup)
  print "    Total: RAM: %.2f GB, vCPU: %d" % (totalram/1000.0,totalcpu)
  totalramforsvc=totalramforsvc+totalram
  totalcpuforsvc=totalcpuforsvc+totalcpu
print "Totals for shared services:"
totalramforsvc=totalramforsvc/1000.0
print "  RAM : %.2f GB" % totalramforsvc
print "  vCPU: %d" % totalcpuforsvc

上面的脚本通过 curl 包装器函数调用了 REST API,并返回 JSON。JSON 的相关部分列出了随后被打印的所有共享实例,以及一些关于服务的信息。以下是一个输出摘录:

清单 11. sharedsvc 脚本输出的摘录
Name: Caching Service
  Caching-Catalog.21421683118601 (RAM: 16768 MB, vCPU: 2) ipas3-CloudGroup1
  Caching-Catalog.11421683118600 (RAM: 16768 MB, vCPU: 2) ipas3-CloudGroup1
  Caching-Container.11421683118602 (RAM: 15744 MB, vCPU: 2) ipas3-CloudGroup1
  Caching-Master.11421683118599 (RAM: 16768 MB, vCPU: 2) ipas3-CloudGroup1
  Total: RAM: 66.05 GB, vCPU: 8
Name: ELB Proxy Service
  Services-elbInstance.11422448392023 (RAM: 4864 MB, vCPU: 2) ipas3-CloudGroup2
  Services-elbManagement.11422448392022 (RAM: 2432 MB, vCPU: 1) ipas3-CloudGroup2
  Services-elbInstance.21422448392024 (RAM: 4864 MB, vCPU: 2) ipas3-CloudGroup2
  Total: RAM: 12.16 GB, vCPU: 5
Totals for shared services:
  RAM : 146.43 GB
  vCPU: 36

结束语

本教程展示了一些使用 IBM PureApplication System CLI 和 REST API 的示例。这两个工具都已得到记录,而且您可以使用它们来自动执行与 PureApplication System 相关的许多任务。PureApplication System 中的访问控制机制使得这些工具可用于 PureApplication System 的所有用户,从系统管理员到个别承包商,他们为其个人使用部署了一个开发环境。

致谢

作者非常感谢 IBM 同事 Marcus Törnqvist 对本文的审阅。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, WebSphere
ArticleID=1004449
ArticleTitle=IBM PureApplication System 中的脚本编写
publish-date=04282015