源码文档路径:ambari\ambari-server\docs\api\v1html
swagger风格api文档:http://www.javashuo.com/article/p-desppoqf-cg.htmlnode
Ambari 借鉴了不少成熟分布式软件的 API 设计。Rest API 就是一个很好地体现。经过 Ambari 的 Rest API,能够在脚本中经过 curl 维护整个集群。
而且,咱们能够用 Rest API 实现一些没法在 Ambari GUI 上面作的操做。下面是一些实例。api
查询关于集群信息ssh
[root@hadron ~]#curl -H "X-Requested-By: ambari" -X GET -u admin:admin http://192.168.1.25:8080/api/v1/clusters { "href" : "http://192.168.1.25:8080/api/v1/clusters", "items" : [ { "href" : "http://192.168.1.25:8080/api/v1/clusters/cc", "Clusters" : { "cluster_name" : "cc", "version" : "HDP-2.5" } } ] }
查询集群主机信息curl
[root@hadron ~]# curl -u admin:admin http://192.168.1.25:8080/api/v1/hosts { "href" : "http://192.168.1.25:8080/api/v1/hosts", "items" : [ { "href" : "http://192.168.1.25:8080/api/v1/hosts/anode1", "Hosts" : { "cluster_name" : "cc", "host_name" : "anode1" } }, { "href" : "http://192.168.1.25:8080/api/v1/hosts/anode2", "Hosts" : { "cluster_name" : "cc", "host_name" : "anode2" } }, { "href" : "http://192.168.1.25:8080/api/v1/hosts/anode3", "Hosts" : { "cluster_name" : "cc", "host_name" : "anode3" } } ] }
例1,经过 API 卸载已安装的 Service
Ambari 提供了 DELETE 的 Rest API,咱们能够经过该 API 来删除 Ambari 中 Service。分布式
不过这里须要注意,这个方法只是从 Ambari Service 中删除了 Service。这样一来,Ambari 的 GUI 界面中再也不显示这个 Service。ui
可是 Service 自己还安装在 Agent 所在的机器。若是用户须要完全的清除掉这个 Service,仍须要手工的到每一个机器卸载(例如,在每一个机器执行 yum erase)。
这里我以删除 Hbase为例。卸载以前,须要确认是否停掉了该 Service。
咱们经过 GET 方法来获得这个结果(这里固然也能够直接从 GUI 上面看到 Service 状态)。
具体的命令以下: url
[root@hadron ~]# curl -u admin:admin -H “X-Requested-By: ambari” -X GET http://192.168.1.25:8080/api/v1/clusters/cc/services/HBASE
中止服务spa
[root@hadron ~]# curl -u admin:admin -H "X-Requested-By: ambari" -X PUT -d \ > '{"RequestInfo":{"context":"Stop Service"},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}'\ > 192.168.1.25:8080/api/v1/clusters/cc/services/HBASE
删除服务设计
[root@hadron ~]# curl -u admin:admin -H "X-Requested-By: ambari" -X \ > DELETE http://192.168.1.25:8080/api/v1/clusters/cc/services/HBASE
执行完成后,HBASE就从Ambari的Service里面删掉了,可是HBASE的package还存在于机器
若是须要完全清除掉HBASE的 package,则须要到各个 Agent 机器执行以下命令。
yum erase “hbase_2_5*”
执行完后,这个 Service 就被完全的清除掉了。
例 2,获取 Service 的 Component 和 Host 列表
上个实例中,让用户登陆到每一个机器去执行 yum 卸载安装包,实际上是不太现实的。
通常咱们会写一个脚本先经过 curl 调用 GET 方法,先获取到 Service 的 Component 列表,
而后再调用 GET 方法,获取 Component 的机器列表,接着调用 DELETE 从 Ambari 中删除 Service。
最后脚本经过 SSH 登陆到各个 Agent 机器上执行 yum 卸载安装包。
脚本示例代码以下(该脚本只能在 Ambari Server 上执行,
由于 Ambari Server 有无密码登陆全部 Agent 机器的权限)。
#!/bin/sh GetHostList() { curl -u admin:admin -H "X-Requested-By: ambari" -X GET http://$AMBARI_HOST:8080/api/v1/clusters/$CLUSTER/services/$SERVICE/components/$1 2>/dev/null |grep host_name|awk -F: '{print $2}'|sed 's/"//g' >> temp_host_list } GetServiceComponent() { curl -u admin:admin -H "X-Requested-By: ambari" -X GET http://$AMBARI_HOST:8080/api/v1/clusters/$CLUSTER/services/$SERVICE 2>/dev/null | grep "component_name" > ./temp_component_list sed -i 's/"//g' ./temp_component_list sed -i 's/,//g' ./temp_component_list } if [ $# != 4 ]; then echo "Usage: $0 Ambari_Server Cluster_Name Service_Name Package_Name" exit 1 fi AMBARI_HOST=$1 CLUSTER=$2 SERVICE=$3 PACKAGE=$4 GetServiceComponent cat ./temp_component_list|while read line do COMPONENT=`echo $line|awk -F: '{print $2}'` GetHostList $COMPONENT done curl -u admin:admin -H "X-Requested-By: ambari" -X DELETE http://$AMBARI_HOST:8080/api/v1/clusters/$CLUSTER/services/$SERVICE rm -f ./temp_component_list >/dev/null 2>&1 #delete duplicated lines (duplicated host name) hosts=`cat temp_host_list|sort |uniq` for host in $hosts do ssh $host "yum erase $PACKAGE" done rm -f temp_host_list >/dev/null 2>&1
例 3,经过 API 执行 Service 的命令
这里,咱们以调用 API 执行 Service Check 为例。
首先须要知道命令的名字,这里每一个 Service 的 Check 命令也是不一样的。
不过 Service Check 是 build-in 的命令,因此有必定的格式可循。
格式大体以下:
NAME_SERVICE_CHCECK
只要将 NAME 替换成对应的 Service,就是该 Service 的 Check 命令。以 YARN 为例,执行以下的命令。
[root@hadron ~]# curl -u admin:admin -H "X-Requested-By: ambari" -X POST -d \ > '{"RequestInfo":{"context":"My YARN Service Check", "command":"YARN_SERVICE_CHECK"},"Requests/resource_filters":[{"service_name":"YARN"}]}' \ > http://192.168.1.25:8080/api/v1/clusters/cc/requests { "href" : "http://192.168.1.25:8080/api/v1/clusters/cc/requests/57", "Requests" : { "id" : 57, "status" : "Accepted" } }
执行完后,能够发如今 WEB GUI 上面,就多了一个正在进行的 Operation
小结经过这三个简单实例,就能够体会到 Ambari Rest API 的做用。 在 Rest API 的基础上,就算脱离了 WEB,咱们也能够很好地控制 Ambari。 固然,咱们也不得不记住不少生涩的参数。 所以,大多状况下,只有当 Ambari 的 GUI 不足以完成需求,或者不指望暴露在 GUI 上面的时候, 就可使用 Rest API。有兴趣的读者能够搜索下 Ambari Server 目录全部的 Python 脚本, 其实 Ambari 自身不少地方都在用 curl 调用 Rest API。