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

🍁 博主 "开着拖拉机回家"带您 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)

钉钉告警发送成功:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由控制和策略路由

文章目录 一、路由控制(1)、前言1.1.1-路由策略 (2)、正反掩码和通配符1.2.1-通配符 (3)、ACL1.3.1-ACL步长1.3.2-步长的作用1.3.3-TCP/UDP端口号 实验1:实验2: 二、前缀列表实验1:2.1.1-前缀列表的表达式2…

全功能知识付费小程序源码系统 界面支持万能DIY装修 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代,知识付费已经成为一种重要的商业模式。为了满足市场对于便捷、高效、个性化的知识付费解决方案的需求,小编给大家分享一款全功能知识付费小程序源码系统。这一系统不仅具备界面支持万能 DIY 装修的独特优势,还配备…

NetSarang Xshell Xftp v7 解锁版 (SSH远程终端工具)

前言 Xshell 7是一款SSH远程终端工具,轻松管理远程服务器,会话管理器,支持多选项卡管理主机,支持远程协议Telnet、Rlogin、SSH/SSH PKCS#11、SFTP、Serial,具有Unicode编码支持、动态端口转发、自定义键盘…

【机器学习】——【线性回归模型】——详细【学习路线】

目录 1. 引言 2. 线性回归理论基础 2.1 线性模型概述 2.2 最小二乘法 3. 数学基础 3.1 矩阵运算 3.2 微积分 3.3 统计学 4. 实现与应用 4.1 使用Scikit-learn实现线性回归 4.2 模型评估 5. 深入理解 5.1 多元线性回归 5.2 特征选择 5.3 理解模型内部 6. 实战与项…

MacOS - 3 招快速去除桌面上的图标文件

在平时用 Mac 电脑的时候,会产生许多我们不用的或废弃的图标、文件,在 Mac 桌面上显得很乱,不仅影响美观也直接影响了我们工作的心情。下面我们分享 3 招快速去除桌面上的图标或文件的方法,有需要的朋友可以试一试。 1. 右键删除&…

Linux常用操作大全(上)

Linux常用操作 文章目录 Linux常用操作一、各类小技巧**1.ctrl c 强制停止****2.ctrl d 退出或登出**3.历史命令搜索4.光标移动快捷键5.清屏6.复制Ctrlshiftc7.粘贴Ctrlshiftv 二、软件安装1.概念2.yum与apt 三、systemctl控制服务四、软链接ln五、日期时区1.date查看日期2.修…

LN6291 2.5A 高效率升压 DC/DC 电压调整器芯片IC

产品概述 LN6291H是一款微小型、高效率、升压型DC/DC调整器。电路由电流模COT控制环路,误差放大器,斜坡补偿电路,比较器和功率开关等模块组成。该芯片可在较宽负载范围内高效稳定的工作,内置一个2.5A的功率开关和软启动保…

如何利用Python处理站点数据、格点观测数据、再分析ERA5;GLDAS、遥感数据、水文数据、气象数据、陆面模式数据、气候变化数据等

Python是功能强大、免费、开源,实现面向对象的编程语言,Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台(x86和arm),Python简洁的语法和对动态输入的支持,再加上解释性语言的本质&…

关于IOMMU问题的扩展

关联CSDN: Steam Deck OLED WLAN下载速率过低问题的排查和解决-CSDN博客 前言 如前所述,Steam Deck OLED WLAN速率低问题和IOMMU有一定的关系,这里我们对IOMMU为什么会对速率有影响进行一个较深入的理解。 对于IOMMU我相信大家通过网上的…

游戏开发丨基于PyGame的消消乐小游戏

文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容:基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…

linux下编译安装和使用cURL库(含有openssl)

cURL是一个利用URL语法指定各种协议(如HTTP、HTTPS、FTP等)进行数据传输的工具,它以客户端的身份,允许用户通过命令行与服务器交互。cURL库(libcurl)是cURL的编程接口(API),提供了一套丰富的函数,供开发者在自己的应用程序中实现网络传输功能 cURL库是网络编程中不可…

群辉USB Copy套件的使用

目录 一、套件安装 二、插入USB设备 三、使用 四、故障排除 有了群辉NAS后,很多U盘、移动硬盘的数据需要备份到NAS中,这时就可以考虑使用USB Copy这个套件了。 USB Copy 乃是群晖上可用于和外接存储设备进行文件复制的一个工具,我常常借助它把外置存储设备的文件拷贝至…

react+ts实现 父子组件通信

创建tsreact的命令 npx create-react-app react-ts --template typescript 使用React和TypeScript进行开发与使用JavaScript进行开发在逻辑上是相同的,但TypeScript增加了类型安全性,这在大型应用中可以减少错误,提高代码的可维护性。下面我…

云计算 |(五)云基础设施机制

文章目录 📚云基础设施机制🐇逻辑网络边界🐇虚拟防火墙🐇虚拟专用网络VPN🐇虚拟服务器🐇云存储设备⭐️云存储等级⭐️网络存储接口⭐️对象存储接口⭐️数据库存储接口🐇云使用监控⭐️监控代理⭐️资源代理⭐️轮询代理📚云基础设施机制 🐇逻辑网络边界 将…

“Docker之道:优雅管理容器数据的艺术“

目录 1. 容器数据卷 1.1 容器卷的概念 1.2 容器卷的使用 1.3 个人案例实现容器卷挂载 1.4 MySQL同步数据案例(容器数据卷操作) 1.4.1 获取 MySQL 镜像 1.4.2 运行 MySQL 容器并配置数据持久化 参数说明: 1.4.3 测试 MySQL 连接 1.4…

表面声波滤波器——叉指换能器(3)

叉指换能器(interdigital transducers,IDT) 是在压电基片表面激励和检测声表面波,从而实现电信号和声信号间的相互转换。 叉指换能器由在压电基片表面上沉积两组互相交错,周期分布的状金属条带(叉指电极)组成,每组电极和一个汇流…

Python Pyperclip:获取剪贴板中的值

哈喽,大家好,我是木头左! 在日常生活和工作中,经常需要将一些信息从一个地方复制到另一个地方。这时,剪贴板就显得尤为重要了。Python作为一门强大的编程语言,也提供了许多方便的工具来帮助处理剪贴板中的数…

【数据结构与算法(C语言)】离散事件模拟- 单链表和队列的混合实际应用

目录 1. 前言2. 流程图3. 数据结构3.1 单链表3.2 链式队列 4. 核心函数4.1 银行业务模拟 void BankSimulation()4.2 初始化 void OpenForDay()4.3 客户到达 void CustomerArrived(Event en)4.4 客户离开 void CustomerArrived(Event en) 5. 非核心函数5.1 新建客户 NewCustomer…

eNSP学习——配置基于全局地址池的DHCP

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、配置基于全局地址池的 DHCP Server 3、配置DHCP Client 主要命令 [R1]dhcp enable //开启 DHCP功能//创建一个全局地址池,地址池名称为huawei1 [R1]ip pool h…

.net8 blazor auto模式很爽(三)用.net8的Blazor自动模式测试,到底在运行server还是WebAssembly

Blazor自动模式到底什么时侯在运行server,什么时侯在运行WebAssembly。这个对我们来说非常重要,官方并没有很清楚地告诉我们。并且存在一些误导,让我们觉得自动模式就是不管我怎么弄,blazor都会自动识别该使用server还是WebAssemb…