源碼文檔路徑: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。