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

news2024/12/30 18:56:16

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁

🦄 个人主页——🎐开着拖拉机回家_大数据运维-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/NODEMANAGER
curl -u admin:admin -i -H X-Requested-By:ambari -XGET   http://192.168.2.153:8080/api/v1/clusters/winner/services/HIVE
curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HIVE
curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/TEZ
curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HBASE
curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/HDFS
curl -u admin:admin -i -H X-Requested-By:ambari -XGET http://192.168.2.153:8080/api/v1/clusters/winner/services/ZOOKEEPER
  • -u Ambari登录用户:密码
  • -i -H获取http请求的完整头部信息,包括请求方法、请求地址、请求头信息等
  • -X 同时想发 HEAD、GET 或 POST 请求,需在 -X 中声明要使用的请求方式

获取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/NODEMANAGER
HTTP/1.1 200 OK
Date: Tue, 29 Aug 2023 06:15:38 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Cache-Control: no-store
Pragma: no-cache
Set-Cookie: AMBARISESSIONID=node0146ihmo69ytgk12k48wrpwrt0v5.node0;Path=/;HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
User: admin
Content-Type: text/plain;charset=utf-8
X-Content-Type-Options: nosniff
Vary: Accept-Encoding, User-Agent
Transfer-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 time

import requests
import json

"""
~~~~~~~~~~~~
author: kangll
date: 2023/8/25 17:22
desc: 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'}
# 钉钉URL
api_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_dict


def 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).content


component_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)

钉钉告警发送成功:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RFA01无线麦克风无线音频模块

1、简介 RFA01无线麦克风模块, 是一款支持2.4G私有协议无线麦克风、无线音频模块,支持秒连、低延时、低功耗、高音质的特性。支持串口AT指令,支持外挂PA射频放大器。主从之间可实现数据的传输功能。 2、模块实物图片 3、模块功能说明 4、模块…

python 深度学习 解决遇到的报错问题3

目录 一、AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0. 二、ImportError: cannot import name logsumexp 三、FutureWarning: Passing (type, 1) or 1type as a synonym of type is deprecated; in a future version of numpy, it w…

【Interaction交互模块】ActionPublisher/ActionReciever

文章目录 需求案例原理0、相应准备1、发布器、接收器2、将把两者联系起来3、前提状态 补充 需求 Interactor只能将一个动作(如按下手柄抓取键),传递给Interactble,如果要传两个或多个,就需要用发布器和接收器。 案例 右手柄抓取…

常见网络通信协议(http、https、ws)及安全协议(SSL、TLS、XTLS)

文章内容删除了一大半不合适的内容,发不出来,你懂得。🥰 一、常见网络通信协议1.1、HTTP 协议1.11 HTTP 协议简介1.12 HTTP 协议的工作流程1.13 HTTP 协议的常用方法1.14 HTTP 协议的常见状态码1.15 HTTP 的缺点 1.2 HTTPS 协议1.21 HTTPS 协…

生态系统模型Biome-BGC、InVEST模型、PLUS模型、SolVES模型、CENTURY模型、CASA模型、生态系统NPP等应用

目录 一、Biome-BGC介绍 二、Linux应用、CDO工具应用、Python应用 三、数据处理实践 四、单点的模拟 五、区域模拟-1 六、区域模拟-2 七、长时间序列模拟案例实践 更多应用 在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算…

IDEA2023隐藏.idea和.iml文件

IDEA2023隐藏.idea和.iml文件 1. 打开file -> setting,快捷键CtrlAlts2. Editor -> File types3. 点击右侧Ignore files and folders一栏4. 添加需要忽略的文件5. 最重要一步 IDEA新建项目会自动生成一个.idea文件夹和.iml文件,开发中不需要对这两个文件修改&…

更改系统所有错误的注册表路径

应用场景 系统文件夹由中文变更为英文后,部分软件在更新时出现找不到对应路径错误 原路径: C:\Users\一颗橘子 改后路径: C:\Users\Orange 问题分析 修改系统文件夹后,对应没有修改软件的注册表信息,仍存在 C:\Users\一…

图神经网络教程之GCN(pyG)

图神经网络-pyG版本的GCN Data(数据) data.x、data.edge_index、data.edge_attr、data.y、data.pos 举个例子 import torch from torch_geometric.data import Data edge_index torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]], dtypetorch.long) #代表…

博客系统 Java Web 开发(Servlet)

目录 一、准备工作 二、设计数据库 三、编写数据库代码 1、建表sql 2、封装数据库的连接操作 3、创建实体类 4、封装数据库的一些增删改查 (1)BlogDao 新增博客: 根据博客 id 来查询指定博客(用于博客详情页&#xff0…

【配置环境】Visual Studio 配置 OpenCV

目录 一,环境 二,下载和配置 OpenCV 三,创建一个 Visual Studio 项目 四,配置 Visual Studio 项目 五,编写并编译 OpenCV 程序 一,环境 Windows 11 家庭中文版Microsoft Visual Studio Community 2022…

【每日运维】RockyLinux8.6升级OpenSSH9.4p1

为什么需要升级openssh呢,因为很多项目进行漏扫结果都会涉及到这个服务器核心组件,一想到以前升级openssh带来的各种依赖性问题就头疼,不管是什么发行版,升级这个东西真的很烦,这次发现可能还会有好一点的通用一点的升…

Docker最简单的来部署前端vue打包好的h5代码

Docker最简单的来部署前端vue打包好的h5代码 前言 是不是想在服务器上部署好几个前端页面,并且也不想让各个页面之间进行隔离,还有就是想要一键部署,实时更新到服务区上,那这篇文章可能帮到您 这里也得选择一个软件叫Idea&#x…

Web3的新商业综合体——SMT震撼来袭!

SMT元宇宙应用生态平台,致力于打造一个Web3.0的新商业综合体。作为一个基础公链系统,SMT各项性能能够完全满足现在当下的各种应用,以及它们的部署。 用区块链技术和新的商业模式体现P2E并实现一个共建共享的理念,重塑大众生活的衣…

Python Qt学习(九)MainWindow

源代码: # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_mainwindow.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do n…

python面试题合集(一)

python技术面试题 1、Python中的幂运算 在python中幂运算是由两个 **星号运算的,实例如下: >>> a 2 ** 2 >>> a 4我们可以看到2的平方输出结果为4。 那么 ^指的是什么呢?我们用代码进行演示: >>>…

音频——I2S 右对齐模式(四)

I2S 基本概念飞利浦(I2S)标准模式左(MSB)对齐标准模式右(LSB)对齐标准模式DSP 模式TDM 模式 文章目录 I2S right时序图逻辑分析仪抓包 I2S right I2S 右对齐标准 也叫日本格式,sony 格式。相比于标准左对齐格式,标准右对齐的不足在于接收设备必须事先知…

奇舞周刊第 504 期:谷歌浏览器 Chrome 117 Beta 又上新功能,爱了爱了!

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 谷歌浏览器 Chrome 117 Beta 又上新功能,爱了爱了! Chrome 117 Beta 版本新增了 CSS 网格子网格 (subgrid)、入场和出场动画支持,以及 CSS、数组…

TiDB 一栈式综合交易查询解决方案获“金鼎奖”优秀金融科技解决方案奖

日前,2023“金鼎奖”评选结果揭晓, 平凯星辰(北京)科技有限公司研发的 TiDB 一栈式综合交易查询解决方案获“金鼎奖”优秀金融科技解决方案奖 , 该方案已成功运用于 多家国有大行、城商行和头部保险企业 。 此次获奖再…

企业名片如何制作二维码?一招教你在线制作二维码名片

想要制作企业二维码名片时要怎么操作呢?现在的企业为了节省资源都开始使用无纸化办公了。当一个企业想要使用电子版名片的时候应该怎么制作呢?可以将企业联系方式、邮箱、地址等做成二维码图片,扫码就能在线查看企业信息。这时候,…

【leetcode 力扣刷题】数学题之计算次幂//次方:快速幂

利用乘法求解次幂问题—快速幂 50. Pow(x, n)372. 超级次方 50. Pow(x, n) 题目链接:50. Pow(x, n) 题目内容: 题目就是要求我们去实现计算x的n次方的功能函数,类似c的power()函数。但是我们不能使用power()函数直接得到答案,那…