🦄?個人主頁——🎐開著拖拉機回家_Linux,大數據運維-CSDN博客?🎐?🍁
🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁
感謝點贊和關注 ,每天進步一點點!加油!
目錄
一、概述
二、集群版本信息
三、組件狀態信息獲取
三、告警實現
一、概述
Ambari 借鑒了很多成熟分布式軟件的 API 設計。Rest API 就是一個很好地體現。通過 Ambari 的 Rest API,可以在腳本中通過 curl 維護整個集群。并且,我們可以用 Rest API 實現一些無法在 Ambari GUI 上面做的操作。
二、集群版本信息
三、組件狀態信息獲取
參考:【Ambari】Python調用Rest API 獲取集群狀態信息并發送釘釘告警-CSDN博客
RESOURCEMANAGER停止
curl -u admin:admin -i -H 'X-Requested-By:ambari' -X PUT -d '{"RequestInfo":{"context":"Restart RESOURCEMANAGER via REST"},"Body" : {"HostRoles" : {"state":"INSTALLED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp105/host_components/RESOURCEMANAGER
- -u Ambari登錄用戶:密碼
- -i -H獲取http請求的完整頭部信息,包括請求方法、請求地址、請求頭信息等
- -X 同時想發 HEAD、GET 或 POST 請求,需在 -X 中聲明要使用的請求方式
ambari頁面顯示停止成功調用
ambari頁面RM服務停止
RESOURCEMANAGER啟動
curl -u admin:admin -i -H 'X-Requested-By:ambari' -X PUT -d '{"RequestInfo":{"context":"Restart RESOURCEMANAGER via REST"},"Body" : {"HostRoles" : {"state":"STARTED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp105/host_components/RESOURCEMANAGER
直接使用RESTART
curl -uadmin:admin -H 'X-Requested-By: ambari' -X POST -d '{"RequestInfo":{"command":"RESTART","context":"Restart RESOURCEMANAGER via REST","operation_level":{"level":"HOST","cluster_name":"winner"}},"Requests/resource_filters":[{"service_name":"YARN","component_name":"RESOURCEMANAGER","hosts":"hdp103"}]}' http://192.168.2.153:8080/api/v1/clusters/winner/requests
請求響應接受
四、告警實現
python 腳本實現RM HA的監控告警
# -*- coding: utf-8 -*-
import logging
import time
from imp import reloadimport requests
import json
import sys
"""
~~~~~~~~~~~~
author: kangll
date: 2023/12/6 13:29
desc: -- curl 請求,如下為測試鏈接curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/hosts/winnerhttp://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp105/host_components/RESOURCEMANAGER
-- datanode 啟動
curl -u admin:admin -i -H 'X-Requested-By:ambari' -X PUT -d '{"RequestInfo":{"context":"Start RESOURCEMANAGER via REST"}
,"Body" : {"ServiceInfo" : {"state":"STARTED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFS"""reload(sys)
sys.setdefaultencoding('utf8')
__author__ = 'kanglilong <kangll@winnerinf.com>'
logger = logging.getLogger('mylogger')
logger.setLevel(level=logging.INFO)
# Ambari rest api 訪問地址
control_url = "http://192.168.2.153:8080/api/v1/clusters/winner/hosts"
# ambari web 登錄賬號
AUTH = ("admin", "admin")
headers = {'Content-Type': 'application/json;charset=utf-8'}
# 釘釘URL
api_url = "https://oapi.dingtalk.com/robot/send?access_token=f4e0f344306ce9b6eec60bec95d5aa7c57f4264a791458dc09121dd7e948ac64"
# RM hostname
rm_hostname_01 = "hdp103"
rm_hostname_02 = "hdp105"
requests_rm_url = "http://192.168.2.153:8080/api/v1/clusters/winner/requests"def getHostComponentsStatus():"""獲取某個服務器上某個組件的狀態信息:param host::return: component_dict 組件與其狀態status 當前節點狀態是否符合期望,getStatus 是否獲取到了狀態"""now_time = time.localtime(time.time())formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', now_time)json_text = {"RequestInfo": {"command": "RESTART","context": "Restart RESOURCEMANAGER via REST","operation_level": {"level": "HOST","cluster_name": "winner"}},"Requests/resource_filters": [{"service_name": "YARN","component_name": "RESOURCEMANAGER","hosts": "{}".format(rm_hostname_01)}]}get_rm_status_url_01 = control_url + "/{}/host_components/RESOURCEMANAGER".format(rm_hostname_01)get_rm_status_url_02 = control_url + "/{}/host_components/RESOURCEMANAGER".format(rm_hostname_02)print("-----------------")rep01 = requests.get(get_rm_status_url_01, auth=AUTH)# 如果狀態碼是20x 則獲取成功print(rep01.status_code)if str(rep01.status_code).startswith("200"):jsonRep01 = json.loads(rep01.text)component_name_01 = jsonRep01['HostRoles']['component_name']status_01 = jsonRep01['HostRoles']['state']ha_state_01 = jsonRep01['HostRoles']['ha_state']host_name_01 = jsonRep01['HostRoles']['host_name'] # STARTEDelse:# 沒有正常獲取到狀態print("沒有正常獲取到狀態")rep02 = requests.get(get_rm_status_url_02, auth=AUTH)# 如果狀態碼是20x 則獲取成功print(rep02.status_code)if str(rep02.status_code).startswith("200"):jsonRep02 = json.loads(rep02.text)component_name_02 = jsonRep02['HostRoles']['component_name']status_02 = jsonRep02['HostRoles']['state']ha_state_02 = jsonRep02['HostRoles']['ha_state']host_name_02 = jsonRep02['HostRoles']['host_name'] # STARTEDelse:# 沒有正常獲取到狀態print("沒有正常獲取到狀態")# RM 為 STARTED statusif component_name_01 == component_name_02 and status_01 == "STARTED" and status_02 == "STARTED":# 兩個RM都為STANDBY則重啟其中一個 if ha_state_01 == ha_state_02 and ha_state_01 == "STANDBY" and ha_state_02 == "STANDBY":text = "告警對象:主機名:" + host_name_01 + ', ' + host_name_02 + ' \n組件名稱:' + component_name_01 + " \n告警內容:HDP集群服務 " + component_name_01 + " 高可用狀態異常 " + ha_state_01 + ", 觸發重啟" + "\n告警時間:" + formatted_timesend_msg(text)print("RESOURCEMANAGER state abnormal.")restart_res = requests.post(requests_rm_url, data=json.dumps(json_text), auth=AUTH, headers=headers)print(restart_res.text)if str(restart_res.status_code).startswith("202"):# 沒有正常獲取到狀態print("重啟請求發送成功!")else:# 沒有正常獲取到狀態print("重啟請求發送成功!")else:#print("RESOURCEMANAGER state normal.")def send_msg(text):""":param text: 告警文本:return:"""json_text = {"msgtype": "text","text": {"content": text}, "at": {"atMobiles": ["1786881xxxx"]}}requests.post(api_url, json.dumps(json_text), headers=headers).contentgetHostComponentsStatus()
釘釘告警發送成功
RM 重啟一臺RM操作完成,觸發HA的強制切換
需要添加配置 ambari.properties
vi /etc/ambari-server/conf/ambari.properties
# 添加如下配置
api.csrfPrevention.enabled=false# 重啟
ambari-server restart
request請求返回的狀態碼