文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Ambari】Python调用Rest API 获取集群状态信息并发送钉钉告警

2023-09-09 07:26

关注

🦄 个人主页——🎐开着拖拉机回家_大数据运维-CSDN博客 🎐✨🍁

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁

感谢点赞和关注 ,每天进步一点点!加油!

目录

一、概述

二、集群版本信息

三、组件状态信息获取

四、DataNode 启动

五、Python 实现 Rest API获取组件状态并告警



Ambari 借鉴了很多成熟分布式软件的 API 设计。Rest API 就是一个很好地体现。通过 Ambari 的 Rest API,可以在脚本中通过 curl 维护整个集群。并且,我们可以用 Rest API 实现一些无法在 Ambari GUI 上面做的操作。


二、集群版本信息



三、组件状态信息获取


curl -u admin:admin -i -H X-Requested-By:ambari -XGET  http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106/host_components/NODEMANAGERcurl -u admin:admin -i -H X-Requested-By:ambari -XGET   http://192.168.2.153:8080/api/v1/clusters/winner/services/HIVEcurl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HIVEcurl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/TEZcurl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HBASEcurl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFScurl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/ZOOKEEPER

获取hdp106服务器上NODEMANAGER 的状态信息

[winner_spark@hdp105 root]$ curl -u admin:admin -i -H X-Requested-By:ambari -XGET  http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106/host_components/NODEMANAGERHTTP/1.1 200 OKDate: Tue, 29 Aug 2023 06:15:38 GMTX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockX-Content-Type-Options: nosniffCache-Control: no-storePragma: no-cacheSet-Cookie: AMBARISESSIONID=node0146ihmo69ytgk12k48wrpwrt0v5.node0;Path=/;HttpOnlyExpires: Thu, 01 Jan 1970 00:00:00 GMTUser: adminContent-Type: text/plain;charset=utf-8X-Content-Type-Options: nosniffVary: Accept-Encoding, User-AgentTransfer-Encoding: chunked{  "href" : "http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106/host_components/NODEMANAGER",  "HostRoles" : {    "cluster_name" : "winner",    "component_name" : "NODEMANAGER",    "desired_admin_state" : "INSERVICE",    "desired_repository_version" : "3.1.4.0-315",    "desired_stack_id" : "HDP-3.1",    "desired_state" : "STARTED",    "display_name" : "NodeManager",    "host_name" : "hdp106",    "maintenance_state" : "OFF",    "public_host_name" : "hdp106",    "reload_configs" : false,    "service_name" : "YARN",    "stale_configs" : false,    "state" : "STARTED",    "upgrade_state" : "NONE",    "version" : "3.1.4.0-315",    "actual_configs" : { }  },  "host" : {    "href" : "http://192.168.2.153:8080/api/v1/clusters/winner/hosts/hdp106"  },  "component" : [    {      "href" : "http://192.168.2.153:8080/api/v1/clusters/winner/services/YARN/components/NODEMANAGER",      "ServiceComponentInfo" : {        "cluster_name" : "winner",        "component_name" : "NODEMANAGER",        "service_name" : "YARN"      }    }  ],  "processes" : [ ]}

四、DataNode 启动


curl -u admin:admin -i -H  'X-Requested-By:ambari'  -X PUT -d  '{"RequestInfo":{"context":"Start DATANODE via REST"},"Body" : {"ServiceInfo" : {"state":"STARTED"}}}' http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFS

datanode 启动 返回 Accepted

ambari 页面显示: Start DATANODE via REST 表示我们执行是成功的。


五、Python 实现 Rest API获取组件状态并告警


import timeimport requestsimport json"""~~~~~~~~~~~~author: kanglldate: 2023/8/25 17:22desc: Ambari rest api 获取组件告警信息-- curl 请求,如下为测试链接        curl -u admin:admin -i -H X-Requested-By:ambari -XGET  http://192.168.2.153:8080/api/v1/clusters/winner/hosts/winner-- 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"""__author__ = 'kanglilong'# 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'}# 钉钉URLapi_url = "https://oapi.dingtalk.com/robot/send?access_token=f4e0f344306ce9b6eec60bec95d5aa7c57f4264a791458dc09121dd7e948ac64"hostname = "hdp105"ambari_server_ip = "192.168.2.153"def getComponentStatus(host, component):    """    获取某个节点 组件的状态    :param host: 主机名    :param component: 组件    :return: 状态    """    get_component_status_url = control_url + "/{}/host_components/{}".format(        host, component)    try:        rep = requests.get(get_component_status_url, auth=AUTH)        if rep.status_code == 200:            jsonRep = json.loads(rep.text)            status = jsonRep['HostRoles']['state']            return status        else:            print("获取组件状态返回异常")    except Exception as e:        print(e)def getHostComponentsStatus(host):    """    获取某个服务器上某个组件的状态信息    :param host:    :return: component_dict   组件与其状态             status           当前节点状态是否符合期望,             getStatus        是否获取到了状态    """    component_dict = {}    get_host_components_status_url = control_url + "/{}/host_components".format(host)    try:        rep = requests.get(get_host_components_status_url, auth=AUTH)        # 如果状态码是20x 则获取成功        print(rep.status_code)        if str(rep.status_code).startswith("20"):            jsonrep = json.loads(rep.text)            items = jsonrep['items']            for itemJson in items:                item = itemJson['HostRoles']['component_name']                # 排除client 角色,与SQOOP等一直是启动状态的客户端,这些不需要启动,也不需要判断状态                if "CLIENT" not in item and "SQOOP" not in item and "INFRA_SOLR" not in item:                    component_status = getComponentStatus(host, item)                    # INSTALLED 表示已安装没有启动,我们默认 INSTALLED 的组件没有 STARTED 就是 停止,要发告警信息                    if component_status == "INSTALLED":                        # {'DATANODE': 'STARTED', 'HBASE_REGIONSERVER': 'STARTED'}                        component_dict[item] = component_status        else:            # 没有正常获取到状态            print("没有正常获取到状态")    except Exception as e:        print(e)    return component_dictdef msg(text, api_url):    """    :param text: 告警文本    :param api_url: 钉钉URL    :return:    """    json_text = {        "msgtype": "text",        "text": {            "content": text        }, "at": {            "atMobiles": ["1786881xxxx"]        }    }    requests.post(api_url, json.dumps(json_text), headers=headers).contentcomponent_dict = getHostComponentsStatus(hostname)for compo_dict in component_dict.items():    compo_dict_len = int(len(component_dict))    if compo_dict_len > 50:  # 告警信息条数判断,告警信息太频繁钉钉告警可能会阻塞告警        time.sleep(30)    component_name = compo_dict[0]    now_time = time.localtime(time.time())    formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', now_time)    text = "告警对象:IP:" + ambari_server_ip + ' 主机名:' + hostname + ' \n组件名称:' + component_name + " \n告警内容:HDP 集群组件 " + component_name + " 停止运行" + "\n告警时间:" + formatted_time    time.sleep(2) # 告警匀速 发出     msg(text, api_url)

钉钉告警发送成功:

来源地址:https://blog.csdn.net/qq_35995514/article/details/132637138

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯