源碼文檔路徑:ambari\ambari-server\docs\api\v1
swagger風格api文檔:https://www.cnblogs.com/felixzh/p/10694724.html
Ambari 借鑒了很多成熟分布式軟件的 API 設計。Rest API 就是一個很好地體現。通過 Ambari 的 Rest API,可以在腳本中通過 curl 維護整個集群。
並且,我們可以用 Rest API 實現一些無法在 Ambari GUI 上面做的操作。下面是一些實例。
查詢關於集群信息
[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" } } ] }
查詢集群主機信息
[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。
但是 Service 本身還安裝在 Agent 所在的機器。如果用戶需要徹底的清除掉這個 Service,仍需要手工的到每個機器卸載(例如,在每個機器執行 yum erase)。
這里我以刪除 Hbase為例。卸載之前,需要確認是否停掉了該 Service。
我們通過 GET 方法來得到這個結果(這里當然也可以直接從 GUI 上面看到 Service 狀態)。
具體的命令如下:
[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
停止服務
[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。