1. 程式人生 > >Ambari 常用的 REST API 介紹

Ambari 常用的 REST API 介紹

stl 不同的 log agen 結果 requests uniq api text

源碼文檔路徑: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 上面做的操作。下面是一些實例。

查詢關於集群信息

[[email protected] ~]#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" } } ] }

查詢集群主機信息

[[email protected] ~]# 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 狀態)。
具體的命令如下:

[[email protected] ~]# curl -u admin:admin -H “X-Requested-By: ambari” -X GET http://192.168.1.25:8080/api/v1/clusters/cc/services/HBASE

停止服務

[[email protected] ~]# 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

刪除服務

[[email protected] ~]# 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 為例,執行如下的命令。

[[email protected] ~]# 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。

Ambari 常用的 REST API 介紹