author:JevonWei

版权声明:原创作品

一 背景

Prometheus的特点

多维度数据模型。
灵活的查询语言。
不依赖分布式存储,单个服务器节点是自主的。
通过基于HTTP的pull方式采集时序数据。
可以通过中间网关进行时序列数据推送。
通过服务发现或者静态配置来发现目标服务对象。
支持多种多样的图表和界面展示,比如Grafana等。

当前环境中业务都是基于docker部署的,为了完善环境中的监控系统,对比了其他监控系统的优缺点之后,最终决定采用Prometheus作为容器化应用的监控系统,

监控环境

四个区域网络相互独立,sz与sh通过proxy实现网络互通,hk,sz,us各部署一台prometheus server,实现同区域的主机数据采集,sz同时作为grafana server,统一展示四个区域的监控信息。各区域部分主机与该区域的Prometheus Server网络是独立的,需要通过Proxy代理通信。各区域的Prometheus Server与Grafana通过Proxy通信。

整体架构图如下

监控系统架构

Prometheus:数据采集与存储
Grafana:数据展示
Alertmanager:告警
PrometheusAlert:告警方式
node_exporter:采集主机信息
cadvisor:采集容器信息

二 部署Prometheus Server

Prometheus 的数据映射路径:/data/prometheus

日志映射路径:/data/logs

Prometheus 主配置文件:/data/prometheus/prometheus.yml

Prometheus Rules文件:/data/prometheus/rules

Prometheus Targets: /data/prometheus/targets/

Prometheus 主配置文件

由于我们这边网络环境中所有主机不是全部相通的,再次无法使用targets自动发现的规则,故在此使用targets静态文件配置主机信息

# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
scrape_timeout: 5s # Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- ${prometheus_server_ip}:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "rules/rules*.yml"
# - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus' # metrics_path defaults to '/metrics'
# scheme defaults to 'http'. #static_configs:
#- targets: ['localhost:9090']
file_sd_configs:
- files:
- targets/prometheus.yaml
refresh_interval: 1ms - job_name: 'nodes_server'
file_sd_configs:
- files:
- targets/nodes*.yaml
refresh_interval: 30s
relabel_configs:
- source_labels:
- "__hostname__"
regex: "(.*)"
target_label: "nodename"
action: replace
replacement: "$1" - job_name: 'docker'
file_sd_configs:
- files:
- targets/docker*.yaml
refresh_interval: 30s
relabel_configs:
- source_labels:
- "__hostname__"
regex: "(.*)"
target_label: "nodename"
action: replace
replacement: "$1"

targets 节点配置文件

# cat targets/nodes.yaml
- targets:
- 1.1.1.1:8888 # support-xxxxx
labels:
cluster: "support"
area: "sz"
job: "docker"
__hostname__: support-xxxxxx
host_ip: 1.1.1.1

rules 告警规则

rules.yaml 告警规则文件

groups:
- name: Node Alert
rules:
- alert: 主机CPU告警
expr: 100 - ((avg by (nodename,instance,area,cluster,host_ip)(irate(node_cpu_seconds_total{mode="idle"}[30m]))) *100) > 70
for: 30m
labels:
name: Host CPU Warning
hostname: "{{ $labels.nodename }}"
level: 2 #告警级别,告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难
generatorURL: "https://grafana.danran.com/d/_Zg4oiwMz/xiang-gang-zhu-ji-xiang-xi-xin-xi?orgId=1&var-area={{ $labels.area }}&var-hostname={{ $labels.nodename }}&var-cluster={{ $labels.cluster }}"
annotations:
description: "{{ $labels.host_ip }} 主机在30m内CPU使用率持续在70%以上,当前值为 {{ $value }}%" #告警信息
fsurl: "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxx-4877-4b14-bda7-xxxxxxx" #支持添加多个飞书机器人告警,用,号分割即可,如果留空或者未填写,则默认发送到配置文件中填写的飞书器人地址

运行Prometheus容器

docker run -p 9090:9090 -d -v  /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /data/prometheus/targets/:/etc/prometheus/targets/  -v /data/prometheus/data:/prometheus -v ${LOGS_DIR}/prometheus:/data/logs/ -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro -v /data/prometheus/rules:/etc/prometheus/rules --restart=always --name prometheus prom/prometheus:v2.25.0 --web.enable-lifecycle --config.file=/etc/prometheus/prometheus.yml --web.external-url=https://https://prometheus-sz.danran.com/ --storage.tsdb.retention=30d

部署Grafana

https://grafana.com/docs/ #官方安装文档

运行Grafana

grafana 数据存储目录:/data/grafana

docker run -d -p 3000:3000 --name=grafana --restart=always -v /data/grafana/grafana/:/var/lib/grafana:rw  -v /data/grafana/grafana.ini:/etc/grafana/grafana.ini:rw -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro grafana/grafana:7.4.3

grafana web界面

登录界面

添加prometheus数据源









import模板

模板下载地址

https://grafana.com/grafana/dashboards

点击目标模板

下载模板

通过模板ID导入

确认模板信息

验证图形信息

饼图插件未安装,需要提前安装

https://grafana.com/grafana/plugins/grafana-piechart-panel

在线安装:
# grafana-cli plugins install grafana-piechart-panel 离线安装:
root@master3:/var/lib/grafana/plugins# pwd
/var/lib/grafana/plugins root@master3:/var/lib/grafana/plugins# ls
grafana-piechart-panel-v1.5.0-0-g3234d63.zip root@master3:/var/lib/grafana/plugins# unzip grafana-piechart-panel-v1.5.0-0-g3234d63.zip
root@master3:/var/lib/grafana/plugins# mv grafana-piechart-panel-3234d63/ grafana-piechart-panel
root@master3:/var/lib/grafana/plugins# systemctl restart grafana-server

部署node_exporter和cadvisor

node_exporter部署

docker run -d -p 9100:9100 --name=node-exporter --restart=always -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" prom/node-exporter:v1.1.2

cadvisor部署

cadvisor由谷歌开源,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况。

docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker:/var/lib/docker:ro --volume=/dev/disk:/dev/disk:ro --publish=8888:8080 --detach=true --name=cadvisor --restart=always google/cadvisor:v0.32.0

部署alertmanager

prometheus触发一条告警的过程:

prometheus--->触发阈值--->超出持续时间--->alertmanager--->分组|抑制|静默--->媒体类型--->邮件|钉钉|微信等。

分组(group): 将类似性质的警报合并为单个通知。
静默(silences): 是一种简单的特定时间静音的机制,例如:服务器要升级维护可以先设置这个时间段告警静默。
抑制(inhibition): 当警报发出后,停止重复发送由此警报引发的其他警报即合并一个故障引起的多个报警事件,可以消除冗余告警

alertmanager.yml配置文件

# cat alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['instance']
group_wait: 30s
group_interval: 1m
repeat_interval: 1h
receiver: 'web.hook.prometheusalert'
routes:
- receiver: 'prometheusalert-feishu'
group_wait: 10s
match:
level: '2'
receivers:
- name: 'web.hook.prometheusalert'
webhook_configs:
- url: "http://${prometheus_server_ip}:8080/prometheusalert"
- name: 'prometheusalert-feishu'
webhook_configs:
- url: "http://${prometheus_server_ip}:8080/prometheusalert?type=fs&tpl=prometheus-fsv2&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx"
inhibit_rules:
- source_match:
level: '3'
target_match:
level: '2'
equal: ['alertname', 'instance']
- source_match:
alertname: '容器CPU告警'
target_match:
alertname: '主机CPU告警'
equal: ['nodename']
- source_match:
alertname: '容器Memory告警'
target_match:
alertname: '主机Memory告警'
equal: ['nodename']

启动alertmanager

alertmanager 数据目录:/data/alert

docker run -d -p 9093:9093 --restart=always -v /data/alert:/etc/alertmanager -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --name alertmanager prom/alertmanager:v0.21.0

部署prometheusalert

conf/app.conf配置文件

本环境使用飞书作为告警通道,故配置文件只修改了飞书的相关配置

#---------------------↓全局配置-----------------------
appname = PrometheusAlert
#监听端口
httpport = 8080
runmode = dev
#设置代理 proxy = http://123.123.123.123:8080
proxy =
#开启JSON请求
copyrequestbody = true
#告警消息标题
title=PrometheusAlert
#链接到告警平台地址
#GraylogAlerturl=http://graylog.org
#钉钉告警 告警logo图标地址
#logourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png
#钉钉告警 恢复logo图标地址
#logourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png
#短信告警级别(等于3就进行短信告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难
messagelevel=2
#电话告警级别(等于4就进行语音告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难
phonecalllevel=4
#默认拨打号码(页面测试短信和电话功能需要配置此项)
defaultphone=
#故障恢复是否启用电话通知0为关闭,1为开启
phonecallresolved=0
#自动告警抑制(自动告警抑制是默认同一个告警源的告警信息只发送告警级别最高的第一条告警信息,其他消息默认屏蔽,这么做的目的是为了减少相同告警来源的消息数量,防止告警炸弹,0为关闭,1为开启)
silent=1
#是否前台输出file or console
logtype=file
#日志文件路径
logpath=/data/logs/prometheusalert/prometheusalertcenter.log
#转换Prometheus,graylog告警消息的时区为CST时区(如默认已经是CST时区,请勿开启)
prometheus_cst_time=0 #---------------------↓webhook-----------------------
#是否开启钉钉告警通道,可同时开始多个通道0为关闭,1为开启
open-dingding=0
#默认钉钉机器人地址
ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxx
#是否开启 @所有人(0为关闭,1为开启)
dd_isatall=1 #是否开启微信告警通道,可同时开始多个通道0为关闭,1为开启
open-weixin=0
#默认企业微信机器人地址
wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx #是否开启飞书v1告警通道,可同时开始多个通道0为关闭,1为开启
open-feishu=1
#默认飞书机器人地址
fsurl= #是否开启飞书v2告警通道,可同时开始多个通道0为关闭,1为开启
open-feishuv2=1
#默认飞书机器人地址
#fsv2url=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxx
fsv2url=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxx-4877-4b14-bda7-xxxxxxxxxx #---------------------↓腾讯云接口-----------------------
#是否开启腾讯云短信告警通道,可同时开始多个通道0为关闭,1为开启
open-txdx=0
#腾讯云短信接口key
TXY_DX_appkey=xxxxx
#腾讯云短信模版ID 腾讯云短信模版配置可参考 prometheus告警:{1}
TXY_DX_tpl_id=xxxxx
#腾讯云短信sdk app id
TXY_DX_sdkappid=xxxxx
#腾讯云短信签名 根据自己审核通过的签名来填写
TXY_DX_sign=腾讯云 #是否开启腾讯云电话告警通道,可同时开始多个通道0为关闭,1为开启
open-txdh=0
#腾讯云电话接口key
TXY_DH_phonecallappkey=xxxxx
#腾讯云电话模版ID
#TXY_DH_phonecalltpl_id=xxxxx
#腾讯云电话sdk app id
TXY_DH_phonecallsdkappid=xxxxx #---------------------↓华为云接口-----------------------
#是否开启华为云短信告警通道,可同时开始多个通道0为关闭,1为开启
open-hwdx=0
#华为云短信接口key
HWY_DX_APP_Key=xxxxxxxxxxxxxxxxxxxxxx
#华为云短信接口Secret
HWY_DX_APP_Secret=xxxxxxxxxxxxxxxxxxxxxx
#华为云APP接入地址(端口接口地址)
HWY_DX_APP_Url=https://rtcsms.cn-north-1.myhuaweicloud.com:10743
#华为云短信模板ID
HWY_DX_Templateid=xxxxxxxxxxxxxxxxxxxxxx
#华为云签名名称,必须是已审核通过的,与模板类型一致的签名名称,按照自己的实际签名填写
HWY_DX_Signature=华为云
#华为云签名通道号
HWY_DX_Sender=xxxxxxxxxx #---------------------↓阿里云接口-----------------------
#是否开启阿里云短信告警通道,可同时开始多个通道0为关闭,1为开启
open-alydx=0
#阿里云短信主账号AccessKey的ID
ALY_DX_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx
#阿里云短信接口密钥
ALY_DX_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx
#阿里云短信签名名称
ALY_DX_SignName=阿里云
#阿里云短信模板ID
ALY_DX_Template=xxxxxxxxxxxxxxxxxxxxxx #是否开启阿里云电话告警通道,可同时开始多个通道0为关闭,1为开启
open-alydh=0
#阿里云电话主账号AccessKey的ID
ALY_DH_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx
#阿里云电话接口密钥
ALY_DH_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx
#阿里云电话被叫显号,必须是已购买的号码
ALY_DX_CalledShowNumber=xxxxxxxxx
#阿里云电话文本转语音(TTS)模板ID
ALY_DH_TtsCode=xxxxxxxx #---------------------↓容联云接口-----------------------
#是否开启容联云电话告警通道,可同时开始多个通道0为关闭,1为开启
RLY_DH_open-rlydh=0
#容联云基础接口地址
RLY_URL=https://app.cloopen.com:8883/2013-12-26/Accounts/
#容联云后台SID
RLY_ACCOUNT_SID=xxxxxxxxxxx
#容联云api-token
RLY_ACCOUNT_TOKEN=xxxxxxxxxx
#容联云app_id
RLY_APP_ID=xxxxxxxxxxxxx #---------------------↓邮件配置-----------------------
#是否开启邮件
open-email=0
#邮件发件服务器地址
Email_host=smtp.qq.com
#邮件发件服务器端口
Email_port=465
#邮件帐号
Email_user=xxxxxxx@qq.com
#邮件密码
Email_password=xxxxxx
#邮件标题
Email_title=运维告警
#默认发送邮箱
Default_emails=xxxxx@qq.com,xxxxx@qq.com #---------------------↓七陌云接口-----------------------
#是否开启七陌短信告警通道,可同时开始多个通道0为关闭,1为开启
open-7moordx=0
#七陌账户ID
7MOOR_ACCOUNT_ID=Nxxx
#七陌账户APISecret
7MOOR_ACCOUNT_APISECRET=xxx
#七陌账户短信模板编号
7MOOR_DX_TEMPLATENUM=n
#注意:七陌短信变量这里只用一个var1,在代码里写死了。
#-----------
#是否开启七陌webcall语音通知告警通道,可同时开始多个通道0为关闭,1为开启
open-7moordh=0
#请在七陌平台添加虚拟服务号、文本节点
#七陌账户webcall的虚拟服务号
7MOOR_WEBCALL_SERVICENO=xxx
# 文本节点里被替换的变量,我配置的是text。如果被替换的变量不是text,请修改此配置
7MOOR_WEBCALL_VOICE_VAR=xxx

飞书告警模版

通过访问prometheusalert的8080端口,对告警渠道的通知模版进行更改

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
{{if $v.labels.container_name }}
**[Prometheus恢复信息]({{$v.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.level}}
开始时间:{{$v.startsAt}}
结束时间:{{$v.endsAt}}
故障主机名: {{$v.labels.nodename}}
故障主机IP:{{$v.labels.host_ip}}
**容器名: {{$v.labels.container_name}}**
集群: {{$v.labels.cluster}}
处理结果: resolved
**{{$v.annotations.description}}**
{{else}}
**[Prometheus恢复信息]({{$v.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.level}}
开始时间:{{$v.startsAt}}
结束时间:{{$v.endsAt}}
故障主机名: {{$v.labels.nodename}}
故障主机IP:{{$v.labels.host_ip}}
集群: {{$v.labels.cluster}}
处理结果: resolved
**{{$v.annotations.description}}**
{{end}}
{{else}}
{{if $v.labels.container_name }}
**[Prometheus告警信息]({{$v.labels.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.level}}
开始时间:{{$v.startsAt}}
故障主机名: {{$v.labels.nodename}}
故障主机IP:{{$v.labels.host_ip}}
容器名: **{{$v.labels.container_name}}**
集群: {{$v.labels.cluster}}
**{{$v.annotations.description}}**
{{else}}
**[Prometheus告警信息]({{$v.labels.generatorURL}})**
*[{{$v.labels.alertname}}]({{$var}})*
告警级别:{{$v.labels.level}}
开始时间:{{$v.startsAt}}
故障主机名: {{$v.labels.nodename}}
故障主机IP:{{$v.labels.host_ip}}
集群: {{$v.labels.cluster}}
**{{$v.annotations.description}}**
{{end}}
{{end}}
{{ end }}

启动prometheusalert

prometheusalert 数据目录:/data/prometheusAlert

docker run -d -p 8080:8080 --restart=always -v /data/prometheusAlert/conf:/app/conf -v ${LOGS_DIR}/prometheusAlert:/data/logs/prometheusalert -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --name prometheusalert feiyu563/prometheus-alert:4.2

参考

https://www.cnblogs.com/JevonWei/p/13188038.html

监控实战之Prometheus的更多相关文章

  1. K8S(13)监控实战-部署prometheus

    k8s监控实战-部署prometheus 目录 k8s监控实战-部署prometheus 1 prometheus前言相关 1.1 Prometheus的特点 1.2 基本原理 1.2.1 原理说明 ...

  2. Prometheus监控实战day1-监控简介

    福利 Prometheus监控实战PDF电子书下载 链接:https://pan.baidu.com/s/1QH4Kvha5g70OhYQdp4YsfQ 提取码:oou5 若你喜欢该资料,请购买该资料 ...

  3. 监控实战Prometheus+Grafana

    这期的分享是监控实战,其实不想写这篇的,因为网上相关的文章也挺多的,但是出于光说不练都是假把式,而且也想告诉你:当帅气的普罗米修斯(Prometheus)遇到高颜值的格拉法纳(Grafana)究竟会擦 ...

  4. prometheus和granfana企业级监控实战v5

    文件地址:https://files.cnblogs.com/files/sanduzxcvbnm/prometheus和granfana企业级监控实战v5.pdf

  5. Docker 监控实战

    如今,越来越多的公司开始使用 Docker 了,现在来给大家看几组数据: 2 / 3 的公司在尝试了 Docker 后最终使用了它 也就是说 Docker 的转化率达到了 67%,而转化市场也控制在 ...

  6. K8S(15)监控实战-ELK收集K8S内应用日志

    K8S监控实战-ELK收集K8S内应用日志 目录 K8S监控实战-ELK收集K8S内应用日志 1 收集K8S日志方案 1.1 传统ELk模型缺点: 1.2 K8s容器日志收集模型 2 制作tomcat ...

  7. K8S(14)监控实战-grafana出图_alert告警

    k8s监控实战-grafana出图_alert告警 目录 k8s监控实战-grafana出图_alert告警 1 使用炫酷的grafana出图 1.1 部署grafana 1.1.1 准备镜像 1.1 ...

  8. 主流前沿的开源监控和报警系统Prometheus+Grafana入门之旅

    Prometheus概述 定义 Prometheus 官网地址 https://prometheus.io/ Prometheus 官网文档地址 https://prometheus.io/docs/ ...

  9. 项目实战——企业级Zabbix监控实战(一)

    项目实战--企业级Zabbix监控实战 实验一:Zabbix监控的搭建 1.实验准备 centos系统服务器3台. 一台作为监控服务器, 两台台作为被监控节点, 配置好yum源. 防火墙关闭. 各节点 ...

随机推荐

  1. 【Java】Debug断点调试常用技巧

    Debug操作技巧 Show Execution Point 将光标回到当前断点停顿的地方 Step Over 执行当前行代码,并将运行进度跳转到下一行. Step Into 进入到当前代码行的方法内 ...

  2. NoSQL:如何使用NoSQL架构构建实时广告系统

    JDNoSQL平台是什么 JDNoSQL平台是一个分布式面向列的KeyValue毫秒级存储服务,存储结构化数据和非机构化数据,支持随机读写与更新,灵活的动态列机制,架构上支持水平扩容,提供高并发.低延 ...

  3. gRPC入门—golang实现

    1.RPC 1.1 什么是RPC RPC(Remote Procedure Call),即远程过程调用,过程就是方法,简单来说,它就是一种能够像调用本地方法一样调用远程计算机进程中的方法的技术,在这种 ...

  4. NAT网络地址转换技术

    NAT网络地址转换技术 目录 一.NAT概述 1.1.概述 1.2.NAT 的应用场景 二.NAT的类型及配置命令 2.1.静态NAT 2.2.动态NAT 2.3.Easy IP 2.4.NATP 2 ...

  5. Vue3全局APi解析-源码学习

    本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...

  6. Linux基本命令精讲

    一.Shell Linux系统中运行的一种特殊程序 在用户和内核之间充当"翻译官 用户登录 Linux系统时,自动加载一个 Shell程序 Bash是 LinuxShell系统中默认使用的程 ...

  7. 基于Istio构建微服务安全加固平台的探索

    简介 An open platform to connect, secure, control and observe services. Istio 是一个由谷歌.IBM 与Lyft共同开发的开源项 ...

  8. Netty 框架学习 —— 添加 WebSocket 支持

    WebSocket 简介 WebSocket 协议是完全重新设计的协议,旨在为 Web 上的双向数据传输问题提供一个切实可行的解决方案,使得客户端和服务器之间可以在任意时刻传输消息 Netty 对于 ...

  9. js实现文字分割动画

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...

  10. Linux:Linux操作防火墙命令

    首先查看Linux的防火墙是否关闭 firewall-cmd Linux上新用的防火墙软件,跟iptables差不多的工具. firewall-cmd --state # 显示防火墙状态 system ...