Zabbix7 IT 基础设施监控秘籍第三版(四)

原文:annas-archive.org/md5/74d6e1997f063295d429f8383644708c

译者:飞龙

协议:CC BY-NC-SA 4.0

第十章:使用自定义脚本和 Zabbix API 扩展 Zabbix 功能

Zabbix 提供了很多开箱即用的功能。但 Zabbix 真正出色的地方在于其可定制性,不仅仅是通过默认的前端,尤其是通过脚本和 Zabbix API 来进行扩展。

本章中,我将讲解如何使用 Zabbix API 的基础知识。接着,我们将看到如何通过 Python 脚本利用 API 构建一些有趣的功能,例如跳板主机。之后,我们将使用 Brian van Baekel 编写的脚本,通过 Zabbix 地图启用和禁用具有有限权限的主机。

跟随这些食谱,你将完全准备好应对 Zabbix API,并且能够使用脚本扩展 Zabbix 功能。本章将扩展你在 Zabbix 中的可能性,几乎是无限的,你将准备好成为一名专业的 Zabbix 用户。

本章将涵盖以下食谱:

  • 设置和管理 API 令牌

  • 使用 Zabbix API 扩展功能

  • 使用 Zabbix API 和 Python 构建跳板主机

  • 启用和禁用 Zabbix 地图中的主机

技术要求

我们将需要一个 Zabbix 服务器和一些新的 Linux 主机。我们还需要具备一些基本的脚本和编程知识。我们将使用 Python 来扩展 Zabbix 的一些功能,并为此提供相应的脚本。

本章所需的代码可以在以下链接找到:

github.com/PacktPublishing/Zabbix-7-IT-Infrastructure-Monitoring-Cookbook/tree/main/chapter10

确保一切准备就绪,你就一定能掌握这些食谱。

设置和管理 API 令牌

本章开始时,我们将进行一些 Zabbix API 配置。如果你之前使用过 Zabbix API,可能会知道通过 API 调用来认证并获取 API 令牌以在脚本中使用是非常麻烦的。但现在情况不同了,我们可以通过 Zabbix 前端生成 API 令牌。

准备工作

对于这个食谱,我们只需要 Zabbix 设置正在运行。我们将使用前端生成 API 令牌。从这里,我们可以在本章后续的集成中使用 API 令牌。

如何操作…

  1. 首先,让我们以超级管理员用户身份登录到 Zabbix 前端。

  2. 导航到 用户 | 用户组,然后点击右上角的蓝色 创建用户组 按钮。

  3. 在这里,我们将创建一个新用户组。在 组名 字段中填写 API 用户

  4. 切换到 主机权限 标签,点击 选择 按钮并选择所有主机组,授予你的 API 用户组对每个主机的权限。

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_01.jpg

图 10.1 – Zabbix 用户 | 用户组,创建用户组主机权限,API 用户

  1. 接下来,转到模板权限选项卡,并在这里做同样的操作。

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_02.jpg

图 10.2 – Zabbix 用户 | 用户组,创建用户组模板权限,API 用户

  1. 点击弹出窗口底部的蓝色选择按钮,然后点击读写,接着点击小圆点的添加按钮。现在应该看起来像这样:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_03.jpg

图 10.3 – Zabbix 用户 | 用户组,用户组权限页面,API 用户

提示

我们可以选择不以超级管理员身份创建 API 用户,而是通过限制API 用户用户组中的主机和模板组访问权限来限制权限。这在生产环境中可能更受欢迎,因为你可能希望限制 API 访问。使用适合你需求的方式。

  1. 点击页面底部的蓝色添加按钮,添加此新的用户组。

  2. 现在,让我们转到用户 | 用户并点击右上角的蓝色创建用户按钮。

  3. 在这里,我们将创建一个新的用户,称为API 用户。创建用户如下:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_04.jpg

图 10.4 – Zabbix 用户 | 用户,用户创建页面,API 用户

  1. 在添加用户之前,切换到权限选项卡并添加超级管理员角色

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_05.jpg

图 10.5 – Zabbix 用户 | 用户,用户权限页面,API 用户

  1. 现在,我们可以通过点击页面底部的蓝色添加按钮来添加用户。

  2. 接下来,我们需要为这个用户创建一些 API 令牌。进入用户 | API 令牌

  3. 接下来,点击右上角的蓝色创建 API 令牌按钮,并将用户字段填写为API名称字段填写为API 图书密钥。将过期时间设置为未来某个较远的时间,或者完全禁用过期——选择你认为最安全的方式。它应该看起来像这样:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_06.jpg

图 10.6 – 管理 | 一般 | API 令牌,API 令牌创建页面

  1. 点击页面底部的蓝色添加按钮,生成新的 API 令牌。这将带我们到下一个页面:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_07.jpg

图 10.7 – Zabbix API 用户 API 令牌生成页面

  1. 确保将认证令牌的值保存到一个安全位置,例如密码保险库。稍后在实验中它会很重要。

  2. 现在我们可以点击页面底部的关闭按钮。这将带我们返回到API 令牌页面,在那里我们可以管理所有已创建的 API 令牌。

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_08.jpg

图 10.8 – Zabbix API 用户 API 令牌页面

它是如何工作的……

由于 Zabbix 现在自带内置的 API 令牌管理功能,因此使用 Zabbix API 变得更加容易。通过使用专用的 API 用户,我们可以在一个位置管理所有令牌,或者我们可以在自己的用户账户下设置私有的 API 令牌。

在这种情况下,我们创建了一个新的 API 用户组。这很重要,因为我们的 API 令牌仍然属于一个用户账户,这意味着它们将遵循该用户的权限。如果我们在除超级管理员以外的其他用户类型下创建 API 用户,我们可以通过 API Users 组来限制我们的 API 访问。

请确保将角色应用于用户并将权限赋予用户组,根据您的环境需求进行调整。同时,请确保为您的 API 令牌设置合理的过期日期,以便我们能够定期重新生成它们。

关于设置和管理 API 令牌,没什么太多需要说明的了,但让我们看看如何在接下来的教程中应用我们在本教程中学到的内容。

使用 Zabbix API 扩展功能

API 是你开始扩展任何软件功能的入口。幸运的是,Zabbix 提供了一个功能强大的 API,我们可以轻松地利用它来扩展功能。Zabbix 还为 Python 发布了 zabbix-utils,使得构建脚本变得更加容易。虽然这是一个很棒的附加功能,但由于并非每个环境都允许使用它,而且我们希望尽量减少依赖项,所以在本次测试中我们不会使用它。尽管如此,您可以在这里查看该库:

github.com/zabbix/python-zabbix-utils

在本教程中,我们将探索如何使用 Zabbix API 来执行一些任务,为在实际生产环境中使用 Zabbix API 打下良好的基础。

准备工作

我们将需要一个包含一些主机的 Zabbix 服务器。我将使用前几章中的 lar-book-centos 主机,但您可以自由使用任何 Zabbix 服务器。我还将使用另一台 Linux 主机来发起 API 调用,但这可以在任何 Linux 主机上完成。

我们需要在 Linux 主机上安装 Python 3,因为我们将使用它来创建 API 调用。

同时,确保你有一个 API 用户和 API 令牌。建议使用我们在第一章创建的令牌。

如何操作…

  1. 首先,在我们的 Linux CLI 中,让我们切换到一个新目录:

    cd /home/zabbix/
    
  2. 使用以下命令在主机上安装 Python 3。

    对于基于 RHEL 的系统,请使用以下命令:

    dnf install python3
    apt install python3
    
  3. Python pip 应该已经随着该软件包默认安装。如果没有,请执行以下命令。

    对于基于 RHEL 的系统,请使用以下命令:

    dnf install python3-pip
    

    对于 Ubuntu 系统,请使用以下命令:

    apt install python3-pip
    

重要说明

您的 Linux 发行版可能附带较旧版本的 Python(3)。如果在本章后续脚本中遇到任何错误,请确保检查错误信息,确认您的 Python 版本是否支持某些功能。

  1. 现在,让我们使用 Python pip 安装所需的依赖项。我们将需要这些依赖项,因为它们将在脚本中使用:

    pip3 install requests
    
  2. 从本书的 Packt GitHub 仓库下载我们脚本的开头,通过执行以下命令:

    wget https://raw.githubusercontent.com/PacktPublishing/Zabbix-7-IT-Infrastructure-Monitoring-Cookbook/main/chapter10/api_test.py
    
  3. 如果你无法从主机上使用 wget,可以通过以下网址下载脚本:github.com/PacktPublishing/Zabbix-7-IT-Infrastructure-Monitoring-Cookbook/tree/main/chapter10/api_test.py

  4. 接下来,我们将通过执行以下命令来编辑我们新下载的脚本:

    vim api_test.py
    
  5. 首先,让我们将 url 变量中的 IP 地址 10.16.16.152 更改为你 Zabbix 服务器的 IP 或 DNS。然后,确保通过将 PUT_YOUR_TOKEN_HERE 替换为我们在本章第一部分生成的 API 令牌,来编辑 api_token 变量:

    url = "http://10.16.16.152/api_jsonrpc.php"
    api_token = "c01ce8726bfdbce02664ec8750f99da 1bbbcb3cb295d924932e2f2808846273"
    
  6. 我们还会在脚本中添加一些行代码,以便检索我们的主机 ID、主机名和所有 Zabbix 主机的接口。确保在以下截图中显示的注释之间添加新的代码:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_09.jpg

图 10.9 – 注释显示代码放置位置

  1. 现在,添加以下几行代码:

    #Function to retrieve the hosts and interfaces
    def get_hosts(api_token, url):
        payload = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": [
                "hostid",
                "host"
            ],
            "selectInterfaces": [
                "interfaceid",
                "ip",
                "main"
            ]
        },
        "id": 2,
        "auth": api_token
        }
        resp = requests.post(url=url, json=payload )
        out = resp.json()
        return out['result']
    
  2. 然后,我们还会添加几行代码,将请求的信息写入文件,以便我们查看执行后发生了什么:

    #Write the results to a file
    def generate_host_file(hosts,host_file):
        hostname = None
        f = open(host_file, "w")
        #Write the host entries retrieved from Zabbix
        for host in hosts:
            hostname = host['host']
            for interface in host["interfaces"]:
                if interface["main"] == "1":
                    f.write(hostname + " " + interface["ip"] + "\n")
        f.close()
        return
    
  3. 现在你应该能够通过执行以下命令来运行它:

    python3 api_test.py
    
  4. 这个应该能运行,但不会给你任何输出。如果这不起作用,请确保重新检查你的步骤。

  5. 让我们检查一下文件,看看通过执行以下命令发生了什么:

    cat /home/zabbix/results
    
  6. 上述命令的输出应该像这样:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_10.jpg

图 10.10 – 使用 cat 命令,显示我们结果的文件

我们现在已经编写了一个简短的 Python 脚本,用来使用 Zabbix API。

它是如何工作的……

使用 Zabbix API 进行编程可以通过 Python 实现,但这绝对不是我们唯一的选择。我们可以使用多种编程语言,包括 Perl、Go、C# 和 Java。

然而,在我们的示例中,我们使用的是 Python,所以让我们看看我们在这里做了什么。如果我们查看脚本,我们有两个主要功能:

  • get_hosts

  • generate_host_file

首先,我们填写了 api_tokenurl 变量,这些变量用于通过 Zabbix API 进行身份验证。然后我们使用这些变量调用 get_hosts 函数,从 Zabbix API 获取信息:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_11.jpg

图 10.11 – Python 函数 Zabbix API 负载

查看代码时,我们使用了 JSON 负载来请求信息,如 host 获取主机名、hostid 获取主机 ID、ip 获取接口的 IP 地址。

现在,如果我们查看最后一个函数generate_host_file,我们可以看到,我们将带有接口 IP 的主机信息写入/home/results文件。这样,我们就有了一个可靠的脚本,可以将主机信息写入文件。

如果你不熟悉 Python 或编程,一开始使用 Zabbix API 可能是一个大挑战。让我们来看看 API 实际是如何工作的:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_12.jpg

图 10.12 – Python 脚本 Zabbix API 功能图

步骤 1中,我们发起一个 API 调用,使用我们目标 URL 和 API 令牌(如变量中所指定)进行身份验证。接下来,在步骤 2中,我们从 Zabbix 接收所请求的数据,并在我们的 Python 脚本中进一步使用这些数据。

步骤 3是我们的数据处理步骤。我们可以对从 Zabbix API 接收到的数据做任何我们想做的事情,但在我们的案例中,我们将数据格式化并写入文件。这就是我们如何使用 Zabbix API 扩展功能的方式。正是在这一阶段,我们的文件被填充了主机名和 IP 信息。

另请参见

如果你对 Zabbix API 及其可用功能感兴趣,可以查看 Zabbix 文档:www.zabbix.com/documentation/current/en/manual/api

使用 Zabbix API 和 Python 构建跳板主机

很多组织都有一个跳板主机(有时也称为堡垒主机),用来通过这台主机访问服务器、交换机和其他设备。跳板主机通常具有访问所有重要设备所需的防火墙规则。现在,如果我们保持监控系统的最新状态,那么我们也应该将每一台主机添加到监控系统中。

我的朋友、前同事以及 Zabbix 爱好者Yadvir Singh,有一个很棒的想法,创建一个 Python 脚本,将所有 Zabbix 主机及其 IP 导出到另一台 Linux 主机上的/etc/hosts文件中。让我们看看如何构建一个类似的跳板主机。

准备工作

我们需要一台安装并准备好的 Linux 主机来进行这个实验。我们将这台主机命名为lar-book-jump。此外,我们还需要 Zabbix 服务器,我将使用lar-book-centos

此外,重要的是要访问Yadvir的 GitHub 账户,关注他并给他的仓库加星,如果你认为这是一个很酷的脚本:github.com/cheatas/zabbix_scripts

重要提示

设置此脚本将覆盖你**/etc/hosts文件的内容,每次脚本执行时都会如此。仅在你理解脚本功能的前提下使用它,确保你使用一个空的主机用于此实验,并检查默认的/etc/hosts**设置。

如何操作…

  1. 如果你还没有创建 API 用户和 API 令牌,请确保首先查看本章的第一个配方。

  2. 使用以下命令在主机 CLI 上安装 Python 3。

    对于基于 RHEL 的系统,使用以下命令:

    dnf install python3
    apt-get install python3
    
  3. Python 的pip应该已经默认与此包一起安装。如果没有,请执行以下命令:

    对于基于 RHEL 的系统,使用以下命令:

    dnf install python3-pip
    

    对于 Ubuntu 系统,使用以下命令:

    apt-get install python3-pip
    
  4. 现在,让我们使用 Python 的pip安装依赖项。我们将需要这些依赖项,因为它们将在脚本中使用:

    pip3 install requests
    
  5. 首先,登录到我们的新 Linux 主机lar-book-jump,并使用以下命令将 Yadvir 的脚本下载到 Linux 主机上:

    wget https://raw.githubusercontent.com/cheatas/zabbix_scripts/main/host_pull_zabbix.py
    
  6. 如果你无法从主机使用wget,可以通过以下网址下载脚本:github.com/cheatas/zabbix_scripts/blob/main/host_pull_zabbix.py

    作为备份,我们还在 Packt 仓库中提供了此脚本。你可以通过以下网址下载此版本:github.com/PacktPublishing/Zabbix-7-IT-Infrastructure-Monitoring-Cookbook/tree/main/chapter10/host_pull_zabbix.py

  7. 现在,让我们通过执行以下命令来编辑脚本:

    vim host_pull_zabbix.py
    
  8. 首先,让我们通过替换myzabbix.com/api_jsonrpc.php为我们 Zabbix 前端的 IP 地址或 DNS 名称,来编辑zabbix_url变量:

    zabbix_url = "http://10.16.16.152/api_jsonrpc.php"
    
  9. 我们不需要填写用户名和密码,因为这仅在旧版本的 Zabbix 中需要。相反,我们将需要一个 API 令牌,正如在本章的第一个食谱中生成的那样。按照以下方式在脚本中填写api_token变量:

    api_token = "c01ce8726bfdbce02664ec8750f99da1bbbcb3cb295
    d924932e2f2808846273"
    

    你可以在文件的底部找到此变量。

  10. 我们还需要取消注释以下几行:

    zabbix_hosts = get_hosts(api_token,zabbix_url)
    generate_host_file(zabbix_hosts,"/etc/hosts")
    
  11. 脚本的结尾现在应该如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_13.jpg

图 10.13 – 在接收到 API 令牌并取消注释后,脚本的结尾

  1. 最后但同样重要的是,确保为你的 Linux 发行版注释和取消注释正确的行。它将如下所示:

    对于 Ubuntu,命令应该如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_14.jpg

图 10.14 – Ubuntu 系统的文件打印

对于基于 RHEL 的系统,命令应该如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_15.jpg

图 10.15 – 基于 RHEL 的系统的文件打印

  1. 这就是要做的所有事情,所以现在我们可以再次执行脚本并开始使用它。让我们按照以下方式执行脚本:

    python3 host_pull_zabbix.py
    
  2. 通过使用以下命令查看主机文件,测试它是否有效:

    cat /etc/hosts
    

    这应该会给我们一个像以下截图所示的输出:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_16.jpg

图 10.16 – /etc/hosts 文件已填充脚本信息

  1. 现在,我们可以直接通过主机名尝试 SSH 连接,而不需要使用 IP 地址,执行以下命令:

    ssh lar-book-agent_passive
    
  2. 我们还可以使用以下命令从文件中查找主机:

    cat /etc/hosts | grep agent
    
  3. 让我们再做一件事。我们希望这个脚本尽可能保持最新。所以,让我们添加一个定时任务。执行以下命令来添加一个定时任务:

    crontab -e
    
  4. 然后添加以下行,确保为你的设置填写正确的脚本位置:

    */15 * * * * $(which python3) /home/host_pull_zabbix.py >> ~/cron.log 2>&1
    

就这样——现在我们通过新的 Python 脚本和 Zabbix,/etc/hosts 文件将始终保持最新。

它是如何工作的……

如果你的组织将 Zabbix 作为主要监控系统,那么你现在已经具备了创建一个组织良好、始终可靠更新且易于使用的跳板主机的技能和知识。

当跳板主机正确设置时,它们非常有用,但重要的是要保持它们的清洁,这样它们才容易更新。

通过使用这个脚本,我们只需在服务器上添加 Python 3 和一个简单的脚本作为要求,但最终的结果是一个能够了解所有环境中主机的跳板主机。

如果你已经跟随了之前的 使用 Zabbix API 扩展功能 的教程,那么你可能会注意到它的工作方式大致相同。我们可以通过下图来看我们如何利用这个脚本:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_17.jpg

图 10.17 – 使用脚本功能的跳板主机图

编辑后,我们的脚本将从图中的 第 1 步 开始,通过 API 调用请求数据,我们使用 API 令牌进行身份验证。在 第 2 步 中,我们接收这些数据。在脚本中,我们添加默认值,然后将所有主机名和 IP 地址写入 /etc/hosts 文件。

现在,因为 Linux 主机使用 /etc/hosts 文件进行主机名到 IP 地址的转换,我们可以在 Zabbix 中使用服务器的真实名称通过 SSH 连接到主机。这使得我们使用跳板主机变得更加方便,因为我们可以使用与 Zabbix 前端中已知的主机名相同的名称。

参见

Yadvir 会在写完这个脚本后继续更新它(到目前为止,我们一直在使用 1.0 版本)。确保关注他的 GitHub 账号并为他的仓库加星,以获取更新。如果你有一些很棒的功能建议,随时可以提交拉取请求。

Zabbix 社区鼓励分享像这样的酷点子和有用的脚本。正如 Yadvir 所展示的那样,我们可以互相分享非常有价值的资源。像 Yadvir 一样——使用 Zabbix 社区 GitHub,并通过向其他 Zabbix 用户的 GitHub 仓库贡献来支持他们。你可以通过以下链接访问 Zabbix 社区 GitHub:

github.com/zabbix/community-templates

从 Zabbix 地图启用和禁用主机

我们注意到,作为 Zabbix 用户无法启用或禁用主机。对于一些公司来说,这可能是一个需求,所以我们为此创建了一个扩展。在本教程中,我将向你展示如何使用这个 Python 脚本并从地图上执行它。

准备工作

对于这个教程,我们所需要的只是 Zabbix 服务器、一些 Python 知识以及 Zabbix API 的一些知识。

如何操作……

  1. 首先,让我们登录到 Zabbix 服务器的 CLI 并创建一个新目录:

    mkdir /etc/zabbix/frontendscripts
    
  2. 切换到新目录:

    cd /etc/zabbix/frontendscripts
    
  3. 现在,从开源 ICT 解决方案的 GitHub 下载公共脚本:

    wget https://github.com/OpensourceICTSolutions/zabbix-toggle-hosts-from-frontend/archive/v2.0.tar.gz
    
  4. 如果你无法从主机使用wget,可以在这里查看脚本:github.com/OpensourceICTSolutions/zabbix-toggle-hosts-from-frontend/releases/tag/v2.0

  5. 使用以下命令解压文件:

    tar -xvzf v2.0.tar.gz
    
  6. 使用以下命令删除tar文件:

    rm v2.0.tar.gz
    
  7. 使用以下命令将脚本从新创建的文件夹移动过来:

    mv zabbix-toggle-hosts-from-frontend-2.0/enable_disable-host.py ./
    
  8. 我们将需要 Python 来使用这个脚本,因此让我们按如下方式安装它。

    对于基于 RHEL 的系统,使用以下命令:

    dnf install python3 python3-pip
    

    对于 Ubuntu 系统,使用以下命令:

    apt-get install python3 python3-pip
    
  9. 我们还需要从pip安装requests模块。按如下方式安装:

    pip3 install requests
    
  10. 现在,让我们使用以下命令编辑脚本:

    vim enable_disable-host.py
    
  11. 在这个文件中,我们将修改urltoken变量。将url变量更改为你的 Zabbix 前端 IP 或 DNS 名称。然后,将PUT_YOUR_TOKEN_HERE替换为你的 Zabbix API token。我将填写以下内容,但请确保输入你自己的信息:

    url = 'http://10.16.16.152/api_jsonrpc.php?'
    token = " c01ce8726bfdbce02664ec8750f99da1bbbcb3cb295d
    924932e2f2808846273 "
    
  12. 现在,我们可以继续到 Zabbix 前端,添加前端脚本。导航到警报 | 脚本,然后点击右上角的蓝色创建脚本按钮。

  13. 添加以下脚本:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_18.jpg

图 10.18 – Zabbix 警报 | 脚本,创建脚本页面,启用

  1. 点击蓝色的添加按钮,然后,在下一页中,再次点击右上角的蓝色创建脚本按钮。

  2. 现在,添加第二个也是最后一个脚本,如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_19.jpg

图 10.19 – Zabbix 警报 | 脚本,创建脚本页面,禁用

  1. 现在,导航到监控 | 地图,你应该能看到一个名为本地网络的地图,因为它是 Zabbix 默认包含的。点击这个地图(或任何包含主机的其他地图)。

  2. 现在,如果你在地图上点击某个主机,你将看到一个下拉菜单,像这样:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_20.jpg

图 10.20 – Zabbix 监控 | 地图,本地网络地图下拉菜单

  1. 如果我们点击这里的禁用,我们会得到一个弹出消息,内容如下:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_21.jpg

图 10.21 – Zabbix 脚本确认窗口

  1. 点击蓝色的执行按钮,这个主机将被禁用。然后,导航到监控 | 主机以确认是否成功。你应该能看到主机被设置为禁用

  2. 返回监控 | 地图,你可以通过相同的下拉菜单再次启用主机。这次选择启用

它是如何工作的…

我们刚刚使用的脚本是用 Python 构建的,利用 Zabbix API。通过这个脚本,我们现在可以作为 Zabbix 用户从 Zabbix 前端启用和禁用主机。

之所以这样有效,是因为监控 | 地图选项即使对于 Zabbix 用户也可用。不过,这个脚本是使用 API 用户来执行的。由于我们的 Zabbix API 用户拥有更多的用户权限,它可以执行该脚本,从 Zabbix 数据库中获取主机信息,并使用这些信息创建维护期。正如下图所示,我们的脚本大致遵循与其他 Zabbix API 工具相同的步骤:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_22.jpg

图 10.22 – Python 脚本 maintenance.py 执行图

因为 Zabbix API 非常灵活,我们可以拉取数据并写入数据,几乎可以做任何我们在前端做的事情。

我们现在可以在 Zabbix 前端的任何地方使用这个很酷的功能,只要我们看到带有主机名的虚线,即使是从监控 | 主机中也可以。

还有更多内容…

在 Zabbix 7 中,可以通过前端向脚本提供输入。如果你想测试这个功能,我们可以稍微编辑一下脚本:

  1. 转到警报 | 脚本并编辑主机/启用主机/禁用脚本。

  2. 命令字段中,将**{HOST.HOST}替换为{MANUALINPUT}**,使得此脚本接受动态输入。

  3. 然后打开高级配置,填写输入提示默认输入字符串输入验证规则字段。现在应该看起来像下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_23.jpghttps://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_24.jpg

图 10.23 – 手动脚本输入

  1. 现在,当我们执行脚本时,它会要求我们输入。在此处填写主机名,输入的主机将在该字段中启用或禁用。

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_10_25.jpg

图 10.24 – 手动脚本输入执行

如你所见,使用这种新的脚本输入方式,现在可以使整个执行过程更加灵活。我们可以像这样以非静态方式执行脚本,从而在执行之前提供用户输入数据。真棒!

另见

Brian van BaekelOpensource ICT Solutions的客户创建了这个脚本,并将其开源。由于 Zabbix 拥有一个非常酷的社区,继续扩展 Zabbix 的可能性,我们也上传了一些自己的脚本。分享即关怀,所以请访问 https://github.com/OpensourceICTSolutions 查看其他开源脚本。

第十一章:维护你的 Zabbix 设置

就像任何一款优秀的软件一样,Zabbix 也需要维护,以便它能够多年持续运行。许多用户从 Zabbix 2.0 时代起就一直在使用他们的设置。如果你具备正确的 Zabbix 知识,这种做法完全是可行的。

在这一章中,我们将了解如何进行一些最重要的 Zabbix 维护工作,以确保你能够保持设置的可用性并顺利运行。我们将覆盖如何创建维护周期、如何备份、如何升级 Zabbix 及其各种组件,并进行一些性能维护。

我们将在接下来的教程中讨论这些内容:

  • 设置 Zabbix 维护周期

  • 备份你的 Zabbix 设置

  • 将 Zabbix 后端从较旧的 PHP 版本升级到 PHP 8.2 或更高版本

  • 将 Zabbix 数据库从较旧的 MariaDB 版本升级到 MariaDB 10.11

  • 升级你的 Zabbix 设置

  • 随着时间推移维护 Zabbix 性能

技术要求

我们将需要几个重要的服务器来完成这些教程。首先,我们需要一台运行 Zabbix 7 服务器,用于设置维护周期并进行性能调优。

对于升级部分,我们将需要以下之一的服务器:

  • 一台运行 Zabbix 服务器 6、PHP 版本低于 8.2、MariaDB 版本低于 11.4 的 Rocky Linux 8 服务器

  • 一台运行 Zabbix 服务器 6、PHP 版本低于 8.3、MariaDB 版本低于 11.4 的 Ubuntu 22.04 服务器

我将把升级服务器命名为 lar-book-zbx6,你可以使用任何你选择的发行版运行它。

如果你之前没有使用过 Zabbix,这一章可能会是一个不错的挑战,因为我们将深入探讨 Zabbix 中一些更高级的过程。

设置 Zabbix 维护周期

当我们在处理 Zabbix 服务器或其他主机时,设置 Zabbix 前端的维护周期非常有用。通过维护周期,我们可以确保在维护期间不会触发警报。在 Zabbix 7 中,您会发现一个改进,即引入了近乎即时的维护周期。由于我们不再需要等待很长时间才能重新加载配置缓存,Zabbix 还调整了定时器流程,可以即时启用新的维护周期。

让我们看看如何在这个教程中安排维护周期。

准备工作

在本教程中,我们只需要我们的 Zabbix 服务器,我将使用 lar-book-rocky。该服务器至少需要一些主机和主机组,以便为其创建维护周期。此外,我们需要了解如何导航 Zabbix 前端。

如何操作……

  1. 我们通过登录前端并导航到数据采集 | 维护,开始这个教程。

  2. 我们将点击右上角的蓝色创建维护周期按钮。

  3. 这将显示一个弹出窗口,在其中我们可以设置我们的维护周期。让我们从定义维护周期参数开始。填写以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_01.jpg

图 11.1 – Zabbix 数据收集 | 维护,创建维护窗口,Patch Tuesday

  1. 现在,在周期部分,我们将创建一个新的维护周期。我们需要点击下划线的添加文本。

  2. 这将带我们到另一个弹出窗口,在那里我们可以设置维护周期。我们需要填写以下信息:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_02.jpg

图 11.2 – Zabbix 数据收集 | 维护,创建维护周期窗口,Patch Tuesday

  1. 现在点击蓝色的添加按钮继续。你现在应该能看到我们的维护周期已经填写完成:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_03.jpg

图 11.3 – Zabbix 配置 | 维护,创建维护周期页面,Patch Tuesday

  1. 现在,在主机组字段旁边,点击选择按钮,选择Linux 服务器主机组。我们的页面应该看起来像这样:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_04.jpg

图 11.4 – Zabbix 配置 | 维护,添加主机到维护页面,Patch Tuesday

  1. 如果你愿意,仍然可以添加一个描述

  2. 接下来,点击页面底部的蓝色添加按钮,完成创建维护周期。这将带我们回到维护周期页面,在那里我们应该能看到我们的维护窗口已经创建成功。

它是如何工作的…

在 Zabbix 中配置操作时,我们告诉 Zabbix 在触发器被触发时执行某个定义的操作。维护周期(带数据收集)通过在维护周期定义的时间段内抑制这些 Zabbix 操作来工作。我们这样做是为了确保在进行主机维护时,Zabbix 用户不会收到任何关于问题的通知。当然,最好只在我们实际在相关主机上工作时使用此功能。不过,只有在操作上勾选了暂停被抑制问题的操作复选框时,这才有效。

在这个示例中,我们已经为 2023 年整个年度创建了一个定期维护周期(带数据收集)。假设我们工作的组织有许多 Linux 主机,每周需要进行补丁更新。我们将维护周期设置为每周二晚上 22:00 到次日凌晨 04:00 之间重复。

请注意,2023 年 12 月 31 日后,Zabbix 将停止此维护期,因为它将不再处于活动状态。在设置计划维护时,我们需要牢记两个时间/日期值。一个是维护期的 Active since/Active till 时间/日期值,另一个是 Periods 时间/日期值。这让我们可以创建更灵活的维护期,以及像我们刚才做的那样的定期维护期。

另外,请注意,nodata 触发功能也会受到维护期的影响,在这两种情况下它都不会触发。

备份你的 Zabbix 配置

在进行任何 Zabbix 配置之前,备份所有重要内容至关重要。在本教程中,我们将介绍在对 Zabbix 配置进行维护之前,应该始终采取的一些最重要的步骤。

准备工作

我们需要 Zabbix 服务器,对于此我将使用 lar-book-rocky。确保准备好 CLI 连接到服务器,因为整个过程将使用 Linux CLI。

如何操作……

  1. 首先,通过 Linux CLI 登录到我们的 Zabbix 服务器,并创建一些新的目录,我们将用于 Zabbix 备份。最好将这个目录放在另一个分区上:

    mkdir /opt/zbx-backup/
    mkdir /opt/zbx-backup/database/
    mkdir /opt/zbx-backup/zbx-config/
    mkdir /opt/zbx-backup/nginx/
    mkdir /opt/zbx-backup/lib/
    mkdir /opt/zbx-backup/shared/
    mkdir /opt/zbx-backup/shared/zabbix/
    mkdir /opt/zbx-backup/shared/doc/
    
  2. 备份我们所有的 Zabbix 配置数据非常重要,这些数据位于 /etc/zabbix/。我们可以通过执行以下命令手动将数据从当前文件夹复制到新的备份文件夹:

    cp -r /etc/zabbix/ /opt/zbx-backup/zbx-config/
    
  3. 现在,我们对 nginx 配置做同样的操作:

    cp -r /etc/nginx/ /opt/zbx-backup/nginx/
    

重要说明

请注意,如果你使用的是 Apache,Web 配置的位置可能会有所不同。请根据需要调整你的命令。对于基于 Red Hat 的系统,通常是 /etc/httpd,对于基于 Debian 的系统,通常是 /etc/apache2

  1. 备份我们的 Zabbix PHP 文件和二进制文件也很重要。我们可以使用以下命令来完成:

    cp -r /usr/share/zabbix/ /opt/zbx-backup/shared/zabbix/
    cp -r /usr/share/doc/zabbix-* /opt/zbx-backup/shared/doc/
    
  2. 最后,确保也备份 /usr/lib 中的 Zabbix 文件:

    cp -r /usr/lib/zabbix/ /opt/zbx-backup/lib/
    
  3. 我们还可以创建一个 cronjob,每天 00:00 自动压缩并备份这些文件。只需执行以下命令:

    crontab -e
    
  4. 并添加以下信息:

    0 0 * * * tar -zcvf /opt/zbx-backup/zbx-config/zabbix.tar.gz /etc/zabbix/ >/dev/null 2>&1
    0 0 * * * tar -zcvf /opt/zbx-backup/web-config/zabbix-web.tar.gz /etc/nginx/ >/dev/null 2>&1
    0 0 * * * tar -zcvf /opt/zbx-backup/shared/zabbix/zabbix_usr_share.tar.gz /usr/share/zabbix/ >/dev/null 2>&1
    0 0 * * * tar -zcvf /opt/zbx-backup/shared/doc/zabbix_usr_share_doc.tar.gz /usr/share/doc/ >/dev/null 2>&1
    0 0 * * * tar -zcvf /opt/zbx-backup/lib /zabbix_usr_lib.tar.gz /usr/lib/zabbix/ >/dev/null 2>&1
    
  5. 这些是我们需要从 Zabbix 堆栈中备份的最重要文件。接下来,我们处理数据库。我们现在还可以使用像 logrotate 这样的轮换工具来管理我们的文件。

  6. 备份我们的数据库非常简单。我们可以直接使用 MySQL 和 PostgreSQL 提供的内置工具。为你的相应数据库执行以下命令(确保填写正确的用户名、数据库名和密码):

    对于 MySQL 数据库:

    mysqldump --add-drop-table --add-locks --extended-insert --single-transaction --quick -u zabbixuser -p zabbixdb > /opt/zbx-backup/database/backup_zabbixDB_<DATE>.sql
    

    对于 PostgreSQL 数据库:

    pg_dump zabbixdb > /opt/zbx-backup/database/backup_ zabbixDB_<DATE>.bak
    
  7. 确保添加正确的位置,因为如果数据库本身很大,数据库转储将会非常庞大。最好将其转储到另一个磁盘/分区,甚至更好的是,转储到另一台机器上。因此,/opt/ 可能不是最佳位置。

  8. 我们还可以通过设置一个 cronjob,执行以下命令来实现:

    crontab -e
    
  9. 然后对于 MySQL,添加以下行,其中**-u是用户名,-p是密码,数据库名是zabbix**。这是 MySQL 的命令:

    55 22 * * 0 mysqldump -u'zabbixuser' -p'password' zabbixdb > /opt/zbx-backup/database/backup_zabbixDB.sql
    
  10. 如果你想通过 cronjob 备份 PostgreSQL 数据库,我们需要在用户的主目录中创建一个文件:

    vim ~/.pgpass
    
  11. 我们将以下内容添加到此文件中,其中zabbixuser是用户名,zabbixdb是数据库名:

    #hostname:port:database:username:password
    localhost:5432:zabbixdb:zabbixuser:password
    
  12. 然后我们可以为 PostgreSQL 添加一个 cronjob,如下所示:

    55 22 * * 0 pg_dump --no-password -U zabbixuser zabbixdb > /opt/zbx-backup/database/backup_zabbixDB_date.bak
    
  13. 我们还可以添加一个 cronjob,只保留一定天数的备份。运行以下命令:

    crontab -e
    
  14. 然后添加以下行,其中**+60**是你希望保留备份的天数:

    55 22 * * 0 find /opt/zbx-backup/database/ -mtime +60 -type f -delete
    
  15. 这就结束了我们展示的以简便方式备份 Zabbix 组件的过程。

重要提示

对于 MySQL 数据库,也有 ExtraBackup 等工具,而对于 Postgres,我们可以使用 PGBarman。虽然这些工具可以用于为系统创建备份,但此处提供的内建示例同样非常实用。

它是如何工作的……

Zabbix 设置由多个组件组成。我们有 Zabbix 前端、Zabbix 服务器和 Zabbix 数据库。这些组件在此设置中需要运行不同的软件,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_05.jpg

图 11.5 – Zabbix 关键组件设置图

从前面的图表中,我们可以看到我们的 Zabbix 前端运行在 NGINX 或 Apache 等 Web 引擎上。我们还需要 PHP 来运行我们的 Zabbix 网页。这意味着我们需要备份两个组件:

  • Web 引擎:NGINX、Apache 或其他

  • PHP

Zabbix 服务器是 Zabbix 设计的应用程序,所以我们这里只需备份一件事:Zabbix 服务器的配置文件

最后但绝对重要的是,我们需要备份我们的数据库。最常用的数据库是 MySQL 和 PostgreSQL,因此我们只需要做一件事:创建 Zabbix 数据库的转储

还有更多……

以这种方式备份 Zabbix 设置是一方面,但当然,这还不是全部。确保你使用快照和其他技术正确备份 Linux 系统。

当你遵循标准备份实施方案时,你应该为 Zabbix 设置中任何不可预见的情况做好准备。

将 Zabbix 后端从较旧的 PHP 版本升级到 PHP 8.2 或更高版本

RHEL7、Ubuntu 20.04 和 Debian 9(Stretch)已不再受到 Zabbix 支持,因此我们的升级方案不再包括从 PHP 版本 7.2 之前升级到 8.2 或更高版本的任何信息。较新的 Linux 版本已随 PHP8.0 或更高版本一起发布,这意味着当我们将 Zabbix 设置从 Zabbix 6 版本升级到 Zabbix 7 时,可以直接进行升级。

Zabbix 7 对 PHP 的要求与 Zabbix 6 不同,这意味着如果我们正在运行 PHP 7.2,实际上在运行最新的 Zabbix 7 版本之前,我们必须进行强制性升级。我个人也倾向于以面向未来的方式工作,所以在本教程中,我们将讲解如何将 PHP 7.2 升级到 8.2,这是截至写作时在基于 RHEL8 的系统上支持的最新版本。

准备工作

对于本教程,我们需要的服务器是安装了基于 RHEL8 的系统,并运行 Zabbix 服务器 6 和 PHP 7.2 版本。

另一种可能是你有一台运行 Debian 系发行版(如 Ubuntu 20.04、Debian 11 或更高版本)服务器。这些系统默认包括 PHP 7.2 或更高版本。

在本教程中,我将始终把两个可能的服务器称作lar-book-zbx6

最后,确保备份你的系统并阅读你正在安装的新版本的发布说明。

如何操作…

本教程分为两个不同的部分,一个针对基于 RHEL8 的系统,另一个针对 Ubuntu 系统。我们将首先讲解 RHEL8 的步骤。

基于 RHEL8 的系统

如果你已经在基于 RHEL8 的系统上运行 PHP 7.2 版本,升级过程会更简单。让我们看看在这种情况下如何升级我们的lar-book-zbx6服务器:

  1. 首先,始终通过以下命令验证我们正在运行的 PHP 版本:

    php-fpm --version
    
  2. 如果版本低于 8.2,我们可以继续执行下一步。我们将执行以下命令:

    dnf module list php
    
  3. 这将显示类似以下截图的内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_06.jpg

图 11.6 – RHEL8 DNF 模块列表(PHP)

  1. 不幸的是,在 RHEL8 上,最新稳定的 PHP 8.3 版本并未包含在来自 AppStream 的 DNF 模块中。这意味着我们必须为基于 RHEL8 的系统找到替代的解决方案。如果你想安装 PHP 8.3 或更高版本,请继续到步骤 9

  2. 由于 PHP 8.2 已包含在 AppStream 列表中,请重置你当前可用的 PHP 模块:

    dnf module reset php
    
  3. 确保回答为Y。然后,我们将通过以下命令启用最新的 PHP 版本:

    dnf module enable php:8.2
    
  4. 再次回答Y以启用 PHP 8.2,然后我们可以通过以下命令升级 PHP 版本:

    dnf update
    
  5. 再次回答Y,你的 PHP 版本现在将运行最新的 PHP 8.2 版本。

  6. 如果我们无法使用dnf module enable方法来安装你想要的版本,我们将不得不依赖其他方式来获取 PHP,最常见的方法是使用 REMI 仓库。

  7. 通过以下命令确保系统是最新的:

    dnf update
    
  8. REMI 依赖于 EPEL 仓库,所以我们需要首先添加 EPEL 仓库:

    dnf install epel-release
    
  9. 安装epel-release后,确保将 Zabbix 从中排除。这可以确保 Zabbix 仅从官方 Zabbix 仓库下载和更新:

    [epel]
    excludepkgs=zabbix*
    
  10. .然后通过以下命令安装 REMI 仓库:

    sudo dnf -y install http://rpms.remirepo.net/enterprise/remi-release-8.rpm
    
  11. 重置 PHP 模块并启用 REMI PHP 8.3 版本:

    dnf module reset php -y
    dnf module install php:remi-8.3
    
  12. 在安装过程中,随时输入 YYes

  13. 然后,验证升级是否成功:

    php-fpm -v
    
  14. 确保重新启动 NGINX(或 Apache)和 php-fpm

    systemctl restart nginx php-fpm
    

这些步骤已在 Rocky Linux RHEL 系统上测试过,但它们应该适用于任何基于 RHEL8 的系统,无论是 Stream 版本还是像 Alma Linux 这样的完整重建版本。

考虑升级到基于 RHEL9 的系统,以便支持 PHP 包的更新版本。

Ubuntu 系统

让我们将 Ubuntu 系统升级到可用的最新版本 PHP:

  1. 首先,通过以下命令将 PPA 仓库添加到我们的主机中:

    apt install software-properties-common
    add-apt-repository ppa:ondrej/php
    
  2. 现在通过以下命令更新仓库:

    apt update
    
  3. 在某些安装中,仓库的密钥可能不可用,在这种情况下,我们可能会看到错误提示 Key is not available。我们可以通过以下命令修复此问题,其中 PUB_KEY_HERE 是错误中显示的密钥:

    apt-key adv --keyserver keyserver.ubuntu.com --recv- keys PUB_KEY_HERE
    
  4. 现在,我们可以通过以下命令安装 PHP 8.3 版本:

    apt install -y php8.3
    apt upgrade -y php
    apt autoremove
    
  5. 就这样,PHP 版本现在应该是我们想要的版本。可以通过以下命令检查 PHP 版本:

    php --version
    

它是如何工作的……

因为 Zabbix 7 要求我们安装 PHP 8.0 或更高版本,如果我们仍然使用 PHP 7.2 来安装 Zabbix 6,就需要升级 PHP 版本。这是与 Zabbix 6 的不同要求,因此在某些情况下升级过程可能会比较长。如果你仍然使用 RHEL7、Ubuntu 20.04 或 Debian 9(Stretch),那么也需要先升级你的 Linux 系统。Zabbix 已停止支持这些较旧的 Linux 版本,以便简化软件包管理、安全性和支持。

目前,仍然可以通过从源代码构建的方式在较旧的 Linux 版本上运行 Zabbix,但不推荐这么做。

在本配方中,我们将 PHP 从 7.2 升级到 PHP 8.2 或 8.3,这些是本文写作时支持的最新稳定版本。进行此升级不会破坏我们当前的 Zabbix 服务器安装。如前所述,这是一个强制升级,因为 PHP 8.0 以下的版本已太旧,无法运行 Zabbix 7。即使升级是可选的,考虑运行最新的稳定软件版本总是好的,这样我们才能为未来做好准备。

现在我们已经升级了 PHP,可以继续升级 Zabbix 数据库引擎。

将 Zabbix 数据库从旧版本的 MariaDB 升级到 MariaDB 11.4

对于我们的 Zabbix 7 安装,我们需要 MariaDB 10.5 或更高版本,因此保持数据库版本最新是个好主意。MariaDB 定期改进其处理某些性能方面的方式。

本配方详细说明了如何将 MariaDB 升级到最新的稳定 LTS 版本,即本文写作时的 MariaDB 11.4。

准备工作

对于本配方,我们需要我们的服务器,我们将其命名为 lar-book-zbx6。此时,服务器正在运行基于 RHEL8 的发行版。

另一个选项是在运行 Debian-based 发行版(如 Ubuntu 22.04、Debian 12 或这些 Linux 发行版的更新版本)的服务器上。我们将升级此服务器上的 MariaDB 实例到 11.4 版本。

如果您已经按照 将 Zabbix 后端从较旧的 PHP 版本升级到 PHP 8.2 或更高版本 文档操作,则您的服务器现在将运行 PHP 版本 8.2 或更高版本。如果没有,请首先按照该文档操作是个好主意。

另外,请确保备份系统并阅读您安装的新版本的发布说明。我们在 备份您的 Zabbix 设置 文档中涵盖了这一点。

如何做…

  1. 首先要做的是,让我们登录到我们的 Linux 主机 CLI,检查我们的版本。执行以下命令:

    对于 Zabbix 服务器:

    zabbix_server --version
    php-fpm --version
    

    对于 MariaDB:

    mysql --version
    
  2. 在验证我们的版本与本文档 准备工作 部分中提到的版本相匹配后,让我们继续升级 MariaDB 的版本。

基于 RHEL 的系统

  1. 在我们的基于 RHEL 的服务器上,在检查版本后,我们首先要做的是停止我们的 Zabbix 环境:

    systemctl stop mariadb nginx zabbix-server
    
  2. 现在使用以下命令设置 MariaDB 的仓库文件:

    vim /etc/yum.repos.d/mariadb.repo
    
  3. 我们将把以下代码添加到这个新文件中。如果使用除 amd64 以外的任何其他架构,请确保在 baseurl 后面添加正确的架构:

    [mariadb-main]
    name = MariaDB Server
    baseurl = https://dlm.mariadb.com/repo/mariadb-server/11.4/yum/rhel/8/x86_64
    gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY
    gpgcheck = 1
    enabled = 1
    module_hotfixes = 1
    [mariadb-maxscale]
    # To use the latest stable release of MaxScale, use "latest" as the version
    # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version
    name = MariaDB MaxScale
    baseurl = https://dlm.mariadb.com/repo/maxscale/latest/yum/rhel/8/x86_64
    gpgkey = file:///etc/pki/rpm-gpg/MariaDB-MaxScale-GPG-KEY
    gpgcheck = 1
    enabled = 1
    [mariadb-tools]
    name = MariaDB Tools
    baseurl = https://downloads.mariadb.com/Tools/rhel/8/x86_64
    gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Enterprise-GPG-KEY
    gpgcheck = 1
    enabled = 1
    [mariadb-main]
    name = MariaDB Server
    baseurl = https://dlm.mariadb.com/repo/mariadb-server/11.4/yum/rhel/8/x86_64
    gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY
    gpgcheck = 1
    enabled = 1
    module_hotfixes = 1
    [mariadb-maxscale]
    # To use the latest stable release of MaxScale, use "latest" as the version
    # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version
    name = MariaDB MaxScale
    baseurl = https://dlm.mariadb.com/repo/maxscale/latest/yum/rhel/8/x86_64
    gpgkey = file:///etc/pki/rpm-gpg/MariaDB-MaxScale-GPG-KEY
    gpgcheck = 1
    enabled = 1
    [mariadb-tools]
    name = MariaDB Tools
    baseurl = https://downloads.mariadb.com/Tools/rhel/8/x86_64
    gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Enterprise-GPG-KEY
    gpgcheck = 1
    enabled = 1
    
  4. 或者更好的方法是使用 MariaDB 设置脚本:

    curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-11.4"
    
  5. 现在使用以下命令升级您的 MariaDB 服务器:

    dnf upgrade MariaDB*
    
  6. 使用以下命令重新启动 MariaDB 服务:

    systemctl start mariadb zabbix-server nginx
    
  7. 现在,MariaDB 应该已经升级到预期的版本。使用以下命令再次检查版本以确保:

    mariadb --version
    

Ubuntu 系统

  1. 在我们的 Ubuntu 服务器上,检查版本后,我们首先要做的是停止我们的 Zabbix 服务器环境:

    systemctl stop mariadb zabbix-server nginx
    
  2. 检查 /etc/apt/sources.list.d/mariadb.list 中的 MariaDB 仓库文件。要检查它是否在 11.4 版本上,请使用以下命令编辑它:

    vim /etc/apt/sources.list.d/mariadb.list
    
  3. 文件应该看起来像以下的代码块。如果看起来不对,请编辑它以匹配。如果使用除 amd64 外的任何其他架构,请确保在 deb 行上添加正确的架构:

    # MariaDB Server
    # To use a different major version of the server, or to pin to a specific minor version, change URI below.
    deb [arch=amd64,arm64] https://dlm.mariadb.com/repo/mariadb-server/11.4/repo/ubuntu jammy main
    deb [arch=amd64,arm64] https://dlm.mariadb.com/repo/mariadb-server/11.4/repo/ubuntu jammy main/debug
    # MariaDB MaxScale
    # To use the latest stable release of MaxScale, use "latest" as the version
    # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version
    deb [arch=amd64,arm64] https://dlm.mariadb.com/repo/maxscale/latest/apt jammy main
    # MariaDB Tools
    deb [arch=amd64] http://downloads.mariadb.com/Tools/ubuntu jammy main
    
  4. 或者,我们可以使用 MariaDB 仓库设置脚本来更新到正确的仓库。执行以下命令:

    curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-11.4"
    
  5. 我们需要使用以下命令移除旧的 MariaDB 包:

    apt remove mariadb-server mariadb-client
    
  6. 现在使用以下命令升级 MariaDB 服务器版本:

    apt install mariadb-server mariadb-client
    
  7. 使用以下命令重新启动 MariaDB:

    systemctl restart mariadb
    
  8. 然后执行 upgrade 命令:

    mariadb-upgrade
    
  9. 现在重新启动 Zabbix:

    systemctl restart zabbix-server nginx
    
  10. 现在,MariaDB 应该已经升级到正确的版本。使用以下命令再次检查版本:

    mariadb --version
    

工作原理…

现在,虽然这可能并非总是必要的要求,但定期升级您的数据库版本是一个明智的想法。您的数据库引擎的新版本可能包括对稳定性和性能的改进,这两者都可能极大地改善您的 Zabbix 服务器。

但请保持关注发布说明和错误报告。在撰写本文时,MariaDB 11.4 是市场上最新的 LTS 版本。您可能希望留在一两个版本之后,因为这些版本仍然得到支持,并且已经在生产中运行了一段时间。毕竟,没有人喜欢出现意外问题,比如 bug。

对于 Zabbix 7,我们确实需要安装至少 MariaDB 10.5 或更新支持的版本,请记住这一点。

还有更多内容…

如果您真的无法升级到 MariaDB 版本 10.5,或者如果您运行的是其他数据库,则支持该数据库的版本,那么就有了一个新的 Zabbix 功能。Zabbix 7 允许我们运行不受支持的数据库版本。当我们编辑 Zabbix 服务器配置文件 /etc/zabbix/zabbix_server.conf 时,我们可以添加以下参数:

AllowUnsupportedDBVersions=1

这将允许您运行一个尚未经 Zabbix 官方测试和支持的旧版或新版数据库版本,但请记住,这样做并不建议。请查看当前 Zabbix LTS 安装要求的信息:

www.zabbix.com/documentation/current/zh/manual/installation/requirements

升级您的 Zabbix 设置

正如我们在整本书中已经看到的那样,Zabbix 7 提供了许多很酷的新功能。Zabbix 7.0 是一个长期支持LTS)版本,因此就像 5.0 和 6.0 一样,您将会长期支持它。让我们看看如何将 Zabbix 服务器从 6.0 版本升级到 7.0 版本。

准备就绪

对于此配方,我们将需要名为 lar-book-zbx6 的服务器。此时,您的服务器将运行基于 RHEL8 的 Linux 发行版或类似 Ubuntu 22.04、Debian 12 或更新版本的 Debian 发行版。

如果您按照 将 Zabbix 后端从较旧的 PHP 版本升级到 PHP 8.2 或更高版本 的步骤,您的服务器现在将运行 PHP 版本 8.2 或更高版本。如果没有,请首先按照该步骤操作是个不错的选择。

如果您按照 将 Zabbix 数据库从较旧的 MariaDB 版本升级到 MariaDB 11.4 的步骤,它现在将运行 MariaDB 版本 11.4。如果没有,请首先按照该步骤操作是个明智的选择。

此外,请务必备份您的系统并阅读您正在安装的新版本的发布说明。我们在 备份您的 Zabbix 设置 配方中已经覆盖了这一点。

如何操作…

首先,让我们登录到我们的 Linux 主机 CLI,检查我们的软件版本:

  1. 发出以下命令检查各自的软件版本:

    对于 Zabbix 服务器:

    zabbix_server --version
    php-fpm --version
    

    对于 MariaDB:

    mariadb --version
    
  2. 在验证我们的版本与此配方中 准备就绪 部分中提到的版本相匹配后,让我们继续升级我们的 Zabbix 服务器。

基于 RHEL 的系统

首先,我们将从 RHEL-based 系统上升级 Zabbix 服务器:

  1. 让我们使用以下命令停止我们的 Zabbix 服务器组件:

    systemctl stop zabbix-server zabbix-agent2
    
  2. 在我们的服务器上,使用以下命令添加新的 Zabbix 7.0 软件库:

    rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/8/ x86_64/zabbix-release-7.0-1.el8noarch.rpm
    
  3. 使用以下命令清理软件库:

    dnf clean all
    
  4. 现在使用以下命令升级 Zabbix 配置:

    dnf upgrade zabbix-server-mysql zabbix-web-mysql zabbix-agent2
    
  5. 此外,安装 Zabbix NGINX 配置:

    dnf install zabbix-nginx-conf
    
  6. 使用以下命令启动 Zabbix 组件:

    systemctl restart zabbix-server zabbix-agent2
    
  7. 当我们检查服务器是否正在运行时,使用以下命令时,它应该显示Activerunning):

    systemctl status zabbix-server
    
  8. 如果没有,使用以下命令检查日志,看看发生了什么:

    tail -f /var/log/zabbix/zabbix_server.log
    
  9. 检查日志文件是否有任何明显错误,如果发现问题,修复后再继续。

  10. 如果我们重新启动服务器,错误应该消失,Zabbix 服务器应继续运行:

    systemctl restart zabbix-server
    
  11. 现在使用以下命令重启 Zabbix 组件:

    systemctl restart nginx php-fpm zabbix-server mariadb
    
  12. 现在一切应该按预期工作,我们应该能够看到新的 Zabbix 7 前端,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_07.jpg

图 11.7 – RHEL 上升级后的 Zabbix 7 前端

Ubuntu 系统

  1. 首先,使用以下命令停止 Zabbix 服务器组件:

    systemctl stop zabbix-server zabbix-agent2
    
  2. 现在使用以下命令为 Ubuntu 添加 Zabbix 7 的新软件库:

    wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1+ubuntu22.04_all.deb
    dpkg -i zabbix-release_7.0-1+ubuntu22.04_all.deb
    

重要提示

始终访问 zabbix.com/download 获取适合你系统的软件库。在本例中,我使用了 Ubuntu 的软件库。请根据你的系统替换为正确的软件库。

  1. 使用以下命令更新软件库信息:

    apt update
    
  2. 现在使用以下命令升级 Zabbix 服务器组件:

    apt install –-only-upgrade zabbix-server-mysql zabbix-frontend-php zabbix-agent2
    
  3. 确保不要覆盖 Zabbix 服务器配置文件。如果你不小心覆盖了配置文件,可以从备份你的 Zabbix 配置食谱中恢复。

  4. 然后使用以下命令安装新的 Zabbix NGINX 配置:

    apt install zabbix-nginx-conf
    
  5. 使用以下命令重启 Zabbix 服务器组件,完成升级:

    systemctl restart zabbix-server nginx zabbix-agent2
    
  6. 使用以下命令检查日志,查看发生了什么:

    tail -f /var/log/zabbix/zabbix_server.log
    
  7. 检查日志文件是否有任何明显错误,如果发现问题,修复后再继续。

  8. 如果我们重新启动服务器,错误应该消失,Zabbix 服务器应继续运行:

    systemctl restart zabbix-server
    
  9. 这应该完成升级过程,如果我们进入前端页面,应该看到新的 Zabbix 7 前端:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_08.jpg

图 11.8 – Ubuntu 升级后的 Zabbix 7 前端

它是如何工作的……

当我们使用最新版本的 Linux 时,升级 Zabbix 可能是个简单的任务。但如果我们使用的是旧版软件,则可能会遇到一些问题。

我们刚刚遵循的步骤展示了一个 Zabbix 6 实例的升级过程,最终将系统升级为运行 Zabbix 7,并且列出了我们可能遇到的最常见问题。

重要提示

在升级过程中,请注意查看你的zabbix_server.log文件,因为该文件会告诉你升级过程中是否发生了任何问题。

我们确保将 PHP 升级到高于 8.0 的版本,因为这是 Zabbix 7 的要求。如果我们运行较旧的 PHP 版本,从 Zabbix 6 升级会变得有些复杂。至于数据库,Zabbix 在 Zabbix 6 和 Zabbix 7 之间保持了相同的要求,要求 MariaDB 10.5 或更新的受支持版本来配置 Zabbix。

现在,您已经升级了所有组件,应该准备好使用 Zabbix 7,并且您的设置会在一段时间内保持未来兼容——当然,直到 Zabbix 8 发布,届时可能会有新的要求。

另见

请确保查看您正在升级的版本的 Zabbix 文档。Zabbix 总是包含详细的要求和流程描述,以便尽可能简化您的升级过程。查看适用于您版本的文档:

www.zabbix.com/documentation/current/en/manual/installation/upgrade

维持 Zabbix 性能

确保您的 Zabbix 设置在长期内持续保持良好性能非常重要。有几个关键组件对保持 Zabbix 设置的最佳性能至关重要。让我们看看如何处理这些组件,确保 Zabbix 设置运行顺利。

准备工作

这个配方中,我们只需要一台 Zabbix 7 服务器。

如何操作…

我们将讨论在维护 Zabbix 服务器性能时人们面临的三个主要问题。首先,先来看看 Zabbix 进程以及如何编辑它们。

Zabbix 进程

一个常见问题是 Zabbix 进程过于繁忙。让我们登录 Zabbix 前端,查看这个问题可能是什么样子。

首先,让我们通过登录到 Zabbix 服务器前端来查看一些消息:

  1. 当我们导航到监控 | 仪表盘,然后选择默认仪表盘全局视图时,我们可能会看到如下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/11.9.jpg

图 11.9 – 来自我们 Zabbix 服务器的问题,发现器进程 75% 繁忙

  1. 然后我们导航到监控 | 主机,点击 Zabbix 服务器主机的最新数据(在我的情况下,主机名是lar-book-rocky)。这将带我们到该主机的最新数据。

  2. 对于过滤器,在名称字段中输入 discovery,然后点击图形以查看发现工作项。这将展示以下图形:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_10.jpg

图 11.10 – Zabbix 服务器发现图,发现数据收集器的利用率百分比

这个图形几乎一直保持在 100%,这也解释了为什么我们在仪表盘上看到了图 11.9 中显示的问题。

  1. 让我们登录到 Zabbix 服务器的 Linux CLI,编辑此进程。

  2. 编辑以下文件,在你的 Zabbix 服务器上:

    vim /etc/zabbix/zabbix_server.conf
    
  3. 现在,如果我们想要给 Zabbix 服务器的 发现器 进程更多空间,我们需要编辑正确的参数。向下滚动,直到你看到以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_11.jpg

图 11.11 – Zabbix 服务器配置文件,StartDiscoverers 默认值

  1. 现在,在此基础上添加一行并输入以下内容:

    StartDiscoverers=2
    
  2. 如果你的文件现在看起来像下面的截图,你可以保存并退出文件:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_12.jpg

图 11.12 – Zabbix 服务器配置文件,StartDiscoverers 2

  1. 为了使更改生效,我们将需要使用以下命令重启 Zabbix 服务器:

    systemctl restart zabbix-server
    
  2. 现在,如果我们返回到 Zabbix 前端,我们应该仍然停留在我们可以看到以下内容的图形界面:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_13.jpg

图 11.13 – Zabbix 服务器发现器图

我们的发现器进程的利用率已下降,这意味着我们的利用率问题将不再出现。这就是我们编辑 Zabbix 服务器进程的方式。

Zabbix 维护进程

另一个人们常遇到的问题是 Zabbix 维护进程过于繁忙。让我们登录到 Zabbix 前端并检查这个问题:

  1. 当我们导航到 监控 | 仪表板,然后选择默认仪表板 全局视图 时,我们可能会看到类似这样的内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/11.14.jpg

图 11.14 – Zabbix 维护进程的问题

  1. 与编辑任何 Zabbix 进程类似,我们也可以编辑 Zabbix 维护进程。让我们登录到 Zabbix 服务器的 Linux 命令行界面来编辑我们的进程。

  2. 让我们在 Zabbix 服务器上编辑以下文件:

    vim /etc/zabbix/zabbix_server.conf
    
  3. 现在,如果我们想要编辑这个过程,我们需要编辑正确的参数。向下滚动,直到你看到以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_15.jpg

图 11.15 – Zabbix 配置文件,HousekeepingFrequency 1

  1. 这是我们的第一个维护参数。让我们通过在此代码块下添加以下行来编辑此参数:

    HousekeepingFrequency=2
    

重要提示

延长间隔并不能解决你的问题;最多,你只是推迟了不可避免的情况。仅建议在下一个维护窗口期间更改此设置,并应尽量避免这样做。

  1. 现在向下滚动,直到你看到以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_16.jpg

图 11.16 – Zabbix 配置文件,HousekeepingDelete 5000

  1. 上面的截图显示了我们的第二个维护参数。让我们通过在此代码块下添加以下行来编辑此参数:

    MaxHousekeeperDelete=20000
    
  2. 为了使更改生效,我们需要使用以下命令重启 Zabbix 服务器:

    systemctl restart zabbix-server
    

调整 MySQL 数据库

  1. 让我们看看如何轻松调优 MySQL 数据库。首先,打开浏览器访问以下链接:github.com/major/MySQLTuner-perl

  2. 这个链接将我们引导到一个由 Major Hayden 发起的开源 GitHub 项目。务必关注该项目并尽可能提供帮助。我们可以从 GitHub 仓库下载脚本,或者直接使用以下命令:

    wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
    
  3. 现在我们可以使用以下命令执行此脚本:

    perl mysqltuner.pl
    
  4. 这将提示我们输入 MySQL 数据库凭证。填写完毕后继续:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_17.jpg

图 11.17 – MySQL 调优脚本执行

  1. 现在,脚本将输出大量信息,你需要仔细阅读,但最重要的部分在最后——Variables to adjust 之后的所有内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_18.jpg

图 11.18 – MySQL 调优脚本输出

重要提示

不要仅仅复制脚本的输出。该脚本只是给出了可能需要调优的 MySQL 设置的提示。始终查阅建议的设置,并了解这些设置的最佳实践。

  1. 我们可以在 MySQL my.cnf 文件中编辑这些变量。在我的情况下,我使用以下命令进行编辑:

    vim /etc/my.cnf.d/server.cnf
    
  2. 现在,你只需编辑或添加脚本中建议的变量,然后重新启动 MySQL 服务器:

    systemctl restart mariadb
    

它是如何工作的…

我们已经做了三个主要的 Zabbix 服务器性能调优,但还有很多工作要做。让我们回顾一下我们刚刚编辑的内容,思考为什么要这么做,并弄清楚它是否真的是这么简单。

Zabbix 进程

Zabbix 进程是 Zabbix 服务器配置的重要部分,必须小心编辑。在这个实例中,我们只是在一个小型安装中编辑了发现进程。这个问题很容易解决,因为服务器有足够的资源来支持额外的进程运行。

现在,如果我们查看以下示意图,可以看到在我们添加新的发现进程之前的情况:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_19.jpg

图 11.19 – Zabbix 服务器单进程配置示意图

我们可以看到我们的 Linux 主机 正在运行 Zabbix 服务器 应用程序,并且我们可以看到我们的 LLDProcessors 1 进程正在发现 LLD 规则 1LLD 规则 2LLD 规则 3 正在排队,因为一个 LLDProcessor 子进程一次只能处理一个规则。

正如我们所看到的,这对我们的系统来说显然太重了,所以我们添加了另一个 LLDProcessor:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_20.jpg

图 11.20 – Zabbix 服务器多进程配置示意图

我们的新设置将一定程度上平衡负载。发现规则只能由单个发现进程处理。这意味着如果我们有多个发现规则,我们可以像这样添加发现进程,确保每个发现规则都有足够的资源可用。其他进程也是一样的——更多的进程意味着更好的任务分配。

然而,这里有几件事需要小心。首先,并非所有问题都可以通过简单地增加更多资源来解决。有些 Zabbix 设置配置不当,配置中的某些内容使得我们的进程不必要地繁忙。如果我们解决了配置不当的问题,就可以减少高负载,从而需要更少的进程。

第二点我想强调的是,我们可以不断地向 Zabbix 服务器配置中添加进程——但有其限制。不过,在达到这些限制之前,你肯定会遇到我们的 Linux 主机硬件的极限。确保你有足够的 RAM 和 CPU 能力来实际运行所有这些进程,或者使用 Zabbix 代理来分担负载。同时也要记住,增加更多进程可能需要额外的数据库调优,例如允许更多的数据库连接。

最后但同样重要的是,记住更改 Zabbix 服务器配置需要重启 zabbix-server 进程。在大型安装中,这可能需要很长时间。Zabbix 服务器可能需要进行大量的数据库写入(例如,趋势数据),才能完成 zabbix-server 进程的关闭。

Zabbix 清理工具

现在谈谈 Zabbix 清理工具,这对于尚未设置 MySQL 分区或 PostgreSQL TimescaleDB 分区的 Zabbix 管理员来说是一个非常重要的进程。Zabbix 清理进程连接到我们的数据库,然后逐行删除过期的信息。你可能会想,什么是过期?其实,我们可以在 Zabbix 服务器中设置项目在数据库中保存多久的时间限制。

如果我们查看 管理 | 清理,我们将看到以下截图所示的部分内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_21.JPG

图 11.21 – Zabbix 服务器历史和趋势清理设置

这些是我们的全局 历史趋势 清理参数。这定义了项目数据在数据库中应该保留多久。如果我们查看模板或主机上的项目,我们还可以看到这些参数:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_11_22.jpg

图 11.22 – Zabbix 项目历史和趋势清理参数

这些设置会覆盖全局设置,因此你可以进一步调整清理工具。这就是清理工具如何保持你的数据库正常运行的方式。

但现在,让我们来看一下我们在 Zabbix 服务器配置文件中所做的调整,第一个就是 HousekeepingFrequency。清理频率是指清理程序进程启动的频率。我们将其从每小时一次降低为每两小时一次。现在你可能会认为这样更差,但不一定。很多时候,我们会看到清理工作在一小时后并未完成,然后就一直持续下去。

我们还更改了 MaxHousekeeperDelete 参数,这完全是另一回事。这个参数决定了每次清理程序运行时,Zabbix 清理程序允许删除多少数据库行。默认设置规定每小时可以删除 5000 行数据库记录。而通过我们的新设置,我们现在每两小时可以删除 20000 行数据库记录。每一行基本上就是我们允许删除的单个指标。

这会改变任何事情吗?嗯,可能不会。这完全取决于你的设置。调整 Zabbix 的清理程序对于每种设置都不同,你需要自己确定最优设置。尝试平衡你在图表中看到的内容与我们在这里讨论的两个设置,看看你能优化到什么程度。

然而,到某个时候,你的 Zabbix 设置可能会变得足够大,以至于 Zabbix 的清理程序无法跟上。这时你就需要考虑 MySQL 分区或 PostgreSQL TimescaleDB。没有预定的点可以说明 Zabbix 的清理程序无法跟上,所以从一开始就直接选择 MySQL 分区或 PostgreSQL TimescaleDB 会更为明智。毕竟,任何设置都有可能比预期增长得更大,对吧?更多相关内容请参见本书的第十二章

调整 MySQL 数据库

现在来调整你的 MySQL 数据库,使用 mysqltuner.pl 脚本。这个脚本在后台做了很多工作,但我们可以将其总结为:它查看当前 MySQL 数据库的使用情况,然后输出它认为正确的调整变量。

不要将脚本输出视为最终结果,因为像 Zabbix 的清理程序一样,无法为你的数据库提供一个明确的设置。数据库的复杂性远超做几个调整就能完成的程度。

这个脚本肯定能在一定程度上帮助你调整 MySQL 数据库,尤其是对于较小的设置。但请确保通过定期阅读博客、指南和数据库书籍来扩展你的知识。

还有更多内容……

我们已经讨论了如何调整 MySQL 数据库,但还没有讨论如何调整 PostgreSQL 实例。为了更深入了解,建议访问 PostgreSQL 的维基页面 wiki.postgresql.org/wiki/Performance_Optimization。这里有各种不同的选项和偏好。确保仔细查看它们,并选择最适合你的方案。

Zabbix 7.0 版本中还新增了专门针对以下三种轮询器的功能:

  • 代理轮询器

  • HTTP 代理轮询器

  • SNMP 轮询器(用于 walk[OID] 和 get[OID] 项目)

这些进程现在异步执行检查。意思是它们可以同时执行多个(项目)检查。在早期版本的 Zabbix 中,这些轮询器每次只能执行一个检查。

仍然可以通过例如 StartAgentPollers 添加多个这些进程,但现在其功能有所不同。这将每个轮询器执行最多 1,000 次检查,这可以通过 MaxConcurrentChecksPerPoller 参数进行配置。

第十二章:高级 Zabbix 数据库管理

无论你是已经使用 Zabbix 一段时间,还是正在准备设置你的第一个生产实例,数据库管理从一开始就非常重要。很多时候,人们设置了 Zabbix 数据库,却没有意识到它将会成为一个庞大的数据库。当数据库超过一定大小时,Zabbix 清理进程无法跟上,这时我们就需要考虑不同的方案。

在本章中,我们将讨论如何防止 Zabbix 数据库在 Zabbix 清理进程无法跟上的情况下占用 100% 的磁盘空间。对于 MySQL 用户,我们将研究如何使用数据库分区来控制数据库的大小。对于 PostgreSQL 用户,我们将关注 TimescaleDB 的支持。最后,我们还将了解如何确保 Zabbix 服务器与数据库之间的连接安全。

我们将在以下方案中完成这些任务:

  • 为 Zabbix 数据库设置 MySQL 分区

  • 使用 PostgreSQL 的 TimescaleDB 功能

  • 保护你的 Zabbix MySQL 数据库

不再废话,让我们开始这些方案,了解如何管理我们的数据库。

技术要求

我们将需要一些新的服务器来实现这些方案。首先,一台 Linux 服务器需要运行带有 MySQL(MariaDB)设置的 Zabbix 服务器 7;我们将这台主机称为lar-book-mysql-mgmt。我们还需要一台运行带有 PostgreSQL 的 Zabbix 服务器 7 的 Linux 服务器,我们称之为lar-book-postgresql-mgmt

我们还需要两台服务器来创建一个安全的 Zabbix 数据库设置。一台服务器将运行 MySQL(MariaDB)数据库;我们将这台服务器称为lar-book-secure-db。然后,外部连接到 Zabbix 数据库,我们将有一台 Zabbix 服务器,我们称之为lar-book-secure-zbx

代码文件也可以在 GitHub 仓库中访问,链接如下:

github.com/PacktPublishing/Zabbix-7-IT-Infrastructure-Monitoring-Cookbook/tree/main/chapter12

为 Zabbix 数据库设置 MySQL 分区

在使用 MySQL 数据库时,我们面临的最大问题是 MySQL 默认存储数据的方式。如果我们想删除大量数据,默认的存储方式没有实际的顺序可以利用。MySQL 分区可以解决这个问题;让我们看看如何配置它来用于 Zabbix 数据库。

重要提示

在 Opensource ICT Solutions,我们已经修复了脚本,使其能够与 MySQL 8 一起工作。这个脚本应该可以再次适用于 任何 MySQL 设置。有关更多信息,请查看链接:github.com/OpensourceICTSolutions/zabbix-mysql-partitioning-perl

准备工作

对于本教程,我们需要一个运行中的 Zabbix 服务器,并且该服务器必须有一个 MySQL 数据库。我将在示例中使用 MariaDB,但任何 MySQL 变种应该差不多。我将使用名为 lar-book-mysql-mgmt 的 Linux 主机,该主机已经满足要求。

如果你在生产环境中执行这些步骤,请确保首先创建数据库备份,因为事情总是可能出错。

如何操作…

  1. 首先,登录到我们的 Linux CLI 执行命令。

  2. 使用 TMUX 是个好主意,因为分区对于大型数据库来说可能需要几天时间。即使我们丢失 SSH 连接,TMUX 也会保持会话在后台打开。如果没有安装 TMUX,请先安装它,然后再继续。

    基于 RHEL 的命令如下:

    dnf install tmux
    

    基于 Ubuntu 的命令如下:

    apt install tmux
    
  3. 通过执行以下命令打开一个新的 tmux 会话:

    tmux
    

重要提示

tmux 窗口中运行分区并不是必需的,但绝对是明智之举。分区一个大数据库可能需要很长时间。你可以将数据库移到另一台资源充足(CPU、内存和磁盘速度)的机器上进行分区,或者如果这不可行,可以在分区过程中停止 Zabbix 服务器进程。

  1. 现在,使用以下命令以 root 用户身份登录 MySQL 应用程序:

    mysql -u root -p
    
  2. 现在,使用以下命令切换到 Zabbix 数据库:

    USE zabbix;
    
  3. 我们将需要对一些表进行分区,但要做到这一点,我们需要知道表中的 UNIX 时间戳:

    SELECT FROM_UNIXTIME(MIN(clock)) FROM history;
    

    你将收到如下输出:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_01.jpg

图 12.1 – MySQL 返回历史表上的时间戳

  1. 这个时间戳应该对我们要分区的每个表大致相同。通过对剩余的历史表运行相同的查询来验证这一点:

    SELECT FROM_UNIXTIME(MIN(clock)) FROM 'history';
    SELECT FROM_UNIXTIME(MIN(clock)) FROM 'history_uint';
    SELECT FROM_UNIXTIME(MIN(clock)) FROM 'history_str';
    SELECT FROM_UNIXTIME(MIN(clock)) FROM 'history_text';
    SELECT FROM_UNIXTIME(MIN(clock)) FROM 'history_log';
    SELECT FROM_UNIXTIME(MIN(clock)) FROM 'history_bin';
    
  2. 一个表可能返回不同的值,甚至没有任何值。在创建分区时我们需要考虑这一点。显示NULL的表没有数据,但较早的日期意味着我们需要更早的分区:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_02.jpg

图 12.2 – MySQL 返回历史日志表上的时间戳

  1. 我们从 history 表开始。我们将按天对这个表进行分区,直到今天的日期;对我来说是 18-06-2023。让我们准备以下 MySQL 查询(例如,保存在记事本中):

    ALTER TABLE history PARTITION BY RANGE ( clock)
    (PARTITION p2023_06_11 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-12 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_06_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-13 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_06_13 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-14 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_06_14 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-15 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_06_15 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-16 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_06_16 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-17 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_06_17 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-18 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_06_18 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-19 00:00:00")) ENGINE = InnoDB);
    

提示

如果我们只有 7 天的历史数据,手动创建这个列表并不困难。如果我们要在一个大型现有数据库上执行这项操作,这可能会是一个需要手动编辑的大列表。使用像 Excel 这样的软件或编写一个小脚本来生成大列表会比较容易。

  1. 确保这里最旧的分区与我们在第 9 步中收集的时间戳相匹配。在我的案例中,最旧的数据来自 2023 年 6 月 11 日,因此这是我的最旧分区。另外,确保你最新的分区与正在分区的日期相匹配。

  2. 第 9 步中复制并粘贴准备好的 MySQL 查询,并按Enter键。这可能需要一段时间,因为你的表可能非常大。完成后,你将看到以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_03.jpg

图 12.3 – MySQL 成功返回历史表的查询结果

  1. 对剩余的历史表进行相同的分区;确保使用其他 UNIX 时间戳来进行最早的分区:

    • history_uint

    • history_str

    • history_text

    • history_log

    • history_bin

  2. 一旦你完成所有历史表的分区,接下来让我们对trends表进行分区。我们有两个这样的表,分别是trendstrends_uint

  3. 我们将使用以下命令再次检查时间戳:

    SELECT FROM_UNIXTIME(MIN(clock)) FROM trends;
    SELECT FROM_UNIXTIME(MIN(clock)) FROM trends_uint;
    
  4. 对于这些表,重要的是要关注最早的月份。对于我的表,这是 2023 年 6 月。

  5. 现在,让我们为这个表准备并执行分区。让我们从第 14 步中看到的最早时间戳开始,做两个额外的分区:

    ALTER TABLE trends PARTITION BY RANGE ( clock)
    (PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
    PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB);
    
  6. 再次从最早收集的 UNIX 时间戳开始分区,一直到当前月份。但是,为未来的数据创建一些新分区也无妨:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_04.jpg

图 12.4 – MySQL 成功返回趋势表的查询结果

  1. trends_uint表做同样的操作。

  2. 这就结束了数据库的实际分区。让我们确保我们的分区保持管理。在你的 Zabbix 数据库 Linux 主机上,使用以下命令下载分区脚本:

    wget https://raw.githubusercontent.com/OpensourceICTSolutions/zabbix-mysql-partitioning-perl/main/mysql_zbx_part.pl
    
  3. 如果你不能使用wget,只需从以下链接下载脚本:github.com/OpensourceICTSolutions/zabbix-mysql-partitioning-perl/blob/main/mysql_zbx_part.pl

    或者,你也可以使用此 GitHub 链接下载分区脚本:

    github.com/PacktPublishing/Zabbix-7-IT-Infrastructure-Monitoring-Cookbook/tree/main/chapter12/mysql_zbx_part.pl

  4. 现在,使用以下命令创建目录并将脚本移动到**/usr/lib/zabbix/**文件夹:

    mkdir /usr/lib/zabbix/
    mv mysql_zbx_part.pl /usr/lib/zabbix/
    
  5. 我们将自定义脚本中的一些细节。使用以下内容编辑脚本:

    vim /usr/lib/zabbix/mysql_zbx_part.pl
    

    我们需要编辑以下部分的文本:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_05.jpg

图 12.5 – MySQL Zabbix 分区脚本用户参数

  1. 编辑**$db_schema**,使其匹配你的 Zabbix 数据库名称。

  2. 编辑**$db_user_name**以匹配你的 Zabbix 数据库用户名。

  3. 编辑**$db_password**以匹配你的 Zabbix 数据库密码。

  4. 现在,在**$tables**变量中,我们将添加一些最重要的细节。在这里我们将添加要保留多少天的历史数据以及多少个月的趋势数据。添加你的值;默认设置保留 30 天的历史数据和 12 个月的趋势数据。

  5. 同时,确保编辑**my $curr_tz = Etc/UTC;**行,以匹配你自己的时区。例如,我将使用 Europe/Amsterdam。

提示

如果你使用的是 Zabbix 2.2 版本之前的版本,或 MySQL 5.6 版本之前的版本,或者你正在运行 MySQL 8,那么脚本中需要注释掉并取消注释一些额外的配置行。如果适用于你,请阅读mysql_zbx_part.pl脚本文件中的注释并进行编辑。另外,请查看本食谱引言中提到的 GitHub 仓库。

  1. 在执行脚本之前,我们需要安装一些 Perl 依赖项。在基于 RHEL 的系统上,我们需要额外的仓库。

    基于 RHEL8 的命令如下:

    dnf config-manager --set-enabled powertools
    dnf config-manager --enable crb
    
  2. 使用以下命令安装依赖项。

    基于 RHEL 的命令如下:

    dnf update
    dnf install perl-Sys-Syslog
    dnf install perl-DateTime
    dnf install perl-DBD-mysql
    dnf install perl-DBI
    

    Ubuntu 命令如下:

    apt install liblogger-syslog-perl
    apt install libdatetime-perl
    
  3. 使用以下命令使脚本可执行:

    chmod +x /usr/lib/zabbix/mysql_zbx_part.pl
    
  4. 然后,这是我们应该准备好执行脚本并查看它是否正常工作的时刻。让我们执行它:

    /usr/lib/zabbix/mysql_zbx_part.pl
    
  5. 一旦脚本执行完毕,让我们通过以下命令查看它是否成功:

    journalctl -t mysql_zbx_part
    
  6. 你应该看到如下输出:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_07.jpg

图 12.6 – MySQL Zabbix 分区脚本结果

  1. 现在,执行以下命令:

    crontab -e
    
  2. 要自动执行脚本,请将以下行添加到文件中:

    55 22 * * * /usr/lib/zabbix/mysql_zbx_part.pl
    
  3. 我们需要做的最后一件事是进入 Zabbix 前端。导航到管理 | 日常维护

  4. 由于脚本将接管数据库历史和趋势的删除,必须禁用历史趋势表的日常维护。它将如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_08.jpg

图 12.7 – Zabbix 管理 | 一般 | 历史和趋势的日常维护被禁用

这就是我们 Zabbix 数据库分区设置的结束。

它是如何工作的…

数据库分区看起来像是一个大胆的任务,但一旦将其拆分成小块,其实并不难。它只是将我们最重要的 Zabbix 数据库表分解为基于时间的分区的过程。一旦这些分区设置好,我们只需要通过脚本管理这些表,就可以了。

请看下图,假设今天是2023 年 06 月 19 日。我们有很多由脚本管理的分区。今天我们所有的历史数据将写入当天的分区,而所有的趋势数据将写入本月的分区:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_09.jpg

图 12.8 – Zabbix 分区示意图

实际的脚本只做两件事。它创建新的分区,并删除旧的分区。

对于删除分区,当一个分区的年龄超过$tables变量中指定的时间时,它将删除整个分区。

对于创建分区,每次运行脚本时,它会从今天开始创建未来的 10 个分区,当然,前提是该分区尚不存在。

这样做比使用 Zabbix housekeeper 有一个明显的优点,那就是速度更快!Zabbix housekeeper 会逐行检查数据库数据的 UNIX 时间戳,并在数据超过指定时间后删除该行。这需要时间和资源。而删除分区几乎是瞬间完成的。

然而,分区 Zabbix 数据库的一个缺点是,我们将无法使用前端的历史和趋势配置。这意味着我们不能为不同的项指定不同的历史和趋势;现在一切都是全局的。

另见

当我第一次使用 Zabbix 时,我没有像这本书这样的参考资料。相反,我依赖于网上可用的资源和自己的技能。有很多关于分区和其他内容的优秀指南可供参考。如果这本书没有提到某些内容,确保去 Google 上查找看看是否有相关信息。你还可以查看我们 Zabbix 同行写的一些精彩书籍,当然,如果你自己解决了某个问题,分享就是关爱!

使用 PostgreSQL TimescaleDB 功能

TimescaleDB 是一个开源的关系型 PostgreSQL 数据库扩展,用于基于时间的序列数据。使用 PostgreSQL TimescaleDB 是绕过使用 Zabbix housekeeper 来管理 PostgreSQL 数据库的可靠方法。在本食谱中,我们将介绍如何在新服务器上安装 PostgreSQL TimescaleDB,并与 Zabbix 配合使用。

准备工作

我们需要一台空的 Linux 服务器。我将使用名为lar-book-postgresql-mgmt的服务器。

如何操作……

对于基于 RHEL 的系统和 Ubuntu 系统,我们有一些不同的流程,这也是我们将 如何操作… 部分分为两部分的原因。我们将从 Ubuntu 系统开始。

Ubuntu 安装

  1. 让我们登录到 Linux CLI,并使用以下命令添加 PostgreSQL 仓库:

    apt install gnupg postgresql-common apt-transport-https lsb-release wget
    /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
    
  2. 现在,添加 TimescaleDB 仓库:

    echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
    wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo apt-key add -
    apt update
    
  3. 现在,使用以下安装命令安装 TimescaleDB:

    apt install timescaledb-2-postgresql-15
    
  4. 启动并启用 PostgreSQL 12:

    systemctl enable postgresql
    systemctl start postgresql
    
  5. 现在,继续本食谱中的TimescaleDB 配置部分。

基于 RHEL 的安装

  1. 让我们从登录到 Linux CLI 开始。我们需要 PostgreSQL 版本 11 或更高版本。让我们安装版本 12;首先,禁用 AppStream:

    dnf -qy module disable postgresql
    
  2. 添加正确的仓库:

    dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    
  3. 然后,安装 PostgreSQL:

    dnf install postgresql15 postgresql15-server
    
  4. 确保初始化数据库:

    /usr/pgsql-15/bin/postgresql-15-setup initdb
    
  5. 现在,将仓库信息添加到文件中并保存:

    tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
    [timescale_timescaledb]
    name=timescale_timescaledb
    baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
    repo_gpgcheck=1
    gpgcheck=0
    enabled=1
    gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
    sslverify=1
    sslcacert=/etc/pki/tls/certs/ca-bundle.crt
    metadata_expire=300
    EOL
    
  6. 使用安装命令安装 TimescaleDB:

    dnf install timescaledb-2-postgresql-15
    
  7. 现在,继续执行本配方的 TimescaleDB 配置 部分。

TimescaleDB 配置

在本节中,我们将介绍在完成安装过程后如何设置 TimescaleDB。还有更多的配置内容,让我们一起来看看:

  1. 让我们首先运行以下命令:

    timescaledb-tune
    
  2. 有时这不起作用,您可以像这样指定 PostgreSQL 的位置:

    timescaledb-tune --pg-config=/usr/pgsql-15/bin/pg_config
    
  3. 按照步骤操作,并根据提示用 yesno 回答问题。对于首次设置,所有选项选择 yes 是合适的。

  4. 现在,重新启动 PostgreSQL:

    systemctl restart postgresql-15
    
  5. 如果您还没有安装,请使用以下命令下载并安装 Zabbix。

    基于 RHEL 的命令如下:

    rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/ x86_64/zabbix-release-7.0-1.el8.noarch.rpm
    dnf clean all
    dnf install zabbix-server-pgsql zabbix-web-pgsql zabbix-apache-conf zabbix-agent2
    

    Ubuntu 的命令如下:

    wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1+ubuntu22.04_all.deb
    dpkg -i zabbix-release_7.0-1+ubuntu22.04_all.deb
    apt update
    apt install zabbix-server-pgsql zabbix-frontend-phpphp-pgsql zabbix-apache-conf zabbix-agent2
    
  6. 使用以下命令创建初始数据库:

    sudo -u postgres createuser --pwprompt zabbix
    sudo -u postgres createdb -O zabbix zabbix
    
  7. 导入 PostgreSQL 的数据库架构:

    zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbix psql zabbix
    
  8. 通过编辑 Zabbix 配置文件,将数据库密码添加到其中:

    vim /etc/zabbix/zabbix_server.conf
    
  9. 添加以下行,其中 password 是在第 6 步中设置的密码,DBHost 留空:

    DBHost=
    DBPassword=password
    
  10. 现在,使用以下命令启用 TimescaleDB 扩展:

    echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
    
  11. 解压位于 Zabbix 共享文件夹中的 timescale.sql 脚本:

    gunzip /usr/share/doc/zabbix-sql-scripts/postgresql/timescaledb.sql.gz
    
  12. 现在,让我们运行 timescale.sql

    cat /usr/share/doc/zabbix-sql-scripts/postgresql/timescaledb.sql| sudo -u zabbix psql zabbix
    
  13. 在进入前端之前,我们还需要做一件事。我们需要编辑 pg_hba.conf 文件以允许我们的 Zabbix 前端进行连接。编辑以下文件:

    vim /var/lib/pgsql/15/data/pg_hba.conf
    
  14. 确保文件中的以下行与之匹配;它们需要以 md5 结尾:

    # "local" is for Unix domain socket connections only
    local all all
    scram-sha256
    # IPv4 local connections:
    host all  all  127.0.0.1/32
    md5
    # IPv6 local connections:
    host all  all  ::1/128
    scram-sha256
    
  15. 现在,启动 Zabbix 并使用以下命令完成前端设置:

    在基于 RHEL 的系统上:

    systemctl restart zabbix-server zabbix-agent2 httpd php-fpm
    systemctl enable zabbix-server zabbix-agent2 httpd php-fpm
    

    在 Ubuntu 系统上:

    systemctl restart zabbix-server zabbix-agent2 apache2 php-fpm
    systemctl enable zabbix-server zabbix-agent2 apache2 php-fpm
    
  16. 一旦我们进入前端并登录到我们的设置,导航到管理 | 日常维护

  17. 现在,我们可以编辑以下参数以匹配我们的偏好,TimescaleDB 将负责维护数据保留期限:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_10.jpg

图 12.9 – Zabbix 管理 | 日常维护,TimescaleDB 特定选项

它是如何工作的……

使用 TimescaleDB 功能与您的 Zabbix 设置集成,可以与 PostgreSQL 数据库实现稳固的集成。该扩展由 Zabbix 支持,预计在不久的将来将变得更好。

现在,TimescaleDB 的工作原理是将您的 PostgreSQL 超表按时间分割成数据块。如果我们查看下图,我们可以看到它的样子:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_11.jpg

图 12.10 – TimescaleDB 超表数据块示意图

这些基于时间的块比使用 Zabbix housekeeper 从数据库中删除要快得多。Zabbix housekeeper 会逐行遍历我们的数据库数据,检查 UNIX 时间戳,然后当数据超过指定时间时删除该行。这个过程需要时间和资源。而删除一个块几乎是瞬间完成的。

使用 TimescaleDB 与 Zabbix 数据库结合的另一个优点是,我们仍然可以使用前端的项目历史记录和趋势配置。更重要的是,TimescaleDB 可以压缩我们的数据,以保持数据库的较小体积。

缺点是我们不能为不同的项目指定不同的历史记录和趋势;现在这一切都是全局的。

另见

本教程详细介绍了 PostgreSQL TimescaleDB 的安装。由于这个过程在不断变化,你可能需要从官方 TimescaleDB 文档中获取一些新的信息。你可以在这里查看它们的文档:

docs.timescale.com/latest/getting-started/installation/rhel-centos/installation-yum

保护你的 Zabbix MySQL 数据库

Zabbix 服务器的另一个伟大功能是能够加密数据库与 Zabbix 组件之间的数据。这在你使用分离的数据库和 Zabbix 服务器通过网络连接时尤其有用。中间人攻击 (MITM) 或其他攻击可以在网络上执行,从而获取你的监控数据。

在本教程中,我们将设置 MySQL 加密,确保 Zabbix 组件和数据库之间增加另一层安全性。

准备工作

我们需要一个使用外部数据库的 Zabbix 设置。我将使用 Linux 的 lar-book-secure-dblar-book-secure-zbx 主机。

新的服务器 lar-book-secure-zbx 将用于外部连接到 lar-book-secure-db 数据库服务器。数据库服务器不会运行我们的 Zabbix 服务器;这个过程将运行在 lar-book-secure-zbx 上。

确保 lar-book-secure-db 主机上已安装 MariaDB,并且你正在运行支持加密的最新版本。如果你不知道如何升级数据库,请查看 第十一章 中名为 从旧版本的 MariaDB 升级 Zabbix 数据库到 MariaDB 10.5 的教程,或查阅在线文档。

如何操作…

  1. 确保准备工作部分中两个主机的主机文件包含 Linux 主机的主机名和 IP,并按以下内容编辑文件:

    vim /etc/hosts
    
  2. 然后,在文件中填写你的主机名和 IP。文件应如下所示:

    10.16.16.170 lar-book-secure-db
    10.16.16.171 lar-book-secure-zbx
    
  3. lar-book-secure-db MySQL 服务器上,如果还没做过,请通过登录 MySQL 创建 Zabbix 数据库:

    mysql -u root -p
    
  4. 然后,执行以下命令以创建数据库:

    create database zabbix character set utf8mb4 collate utf8mb4_ bin;
    
  5. 同时,确保创建一个可以安全访问数据库的用户。确保 IP 地址与 Zabbix 服务器的 IP 地址匹配(如果 Zabbix 前端与服务器分开,则还需要匹配该前端的 IP 地址):

    create user 'zabbix'@'10.16.16.171' identified BY 'password';
    grant all privileges on zabbix.* to 'zabbix'@'10.16.16.171';
    flush privileges;
    
  6. 退出 MySQL,然后确保使用以下命令运行安全的mysql脚本:

    mariadb_secure_installation
    
  7. 登录到lar-book-secure-zbx并使用以下命令安装 Zabbix 服务器仓库:

    rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el8.noarch.rpm
    dnf clean all
    
  8. 让我们在服务器上添加 MariaDB 仓库:

    wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
    chmod +x mariadb_repo_setup
    ./mariadb_repo_setup
    
  9. 然后,安装 Zabbix 服务器及其必需的组件。

    使用以下基于 RHEL 的命令:

    dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent2 zabbix-sql-scripts mariadb-client
    

    使用以下 Ubuntu 命令:

    apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent2 mariadb-client
    
  10. 从 Zabbix 服务器连接到远程数据库服务器,并使用以下命令导入数据库架构和默认数据:

    zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -h 10.16.16.170 -uzabbix -p zabbix
    
  11. 现在我们将打开名为openssl.cnf的文件,并通过发出以下命令进行编辑:

    vim /etc/pki/tls/openssl.cnf
    
  12. 在此文件中,我们需要编辑以下行:

    countryName_default = XX
    stateOrProvinceName_default = Default Province
    localityName_default = Default City
    0.organizationName_default = Default Company Ltd
    organizationalUnitName_default.=
    
  13. 完整填写后将如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_12.jpg

图 12.11 – 带有我们个人默认设置的 OpenSSL 配置文件

  1. 我们还可以看到这一行:

    dir = /etc/pki/CA    # Where everything is kept
    
  2. 这意味着默认目录是**/etc/pki/CA**;如果您的目录不同,请相应调整。保存并关闭文件,继续操作。

  3. 让我们使用以下命令为我们的私有证书创建一个新文件夹:

    mkdir -p /etc/pki/CA/private
    
  4. 现在,让我们在新文件夹中创建我们的密钥对。发出以下命令:

    openssl req -new -x509 -keyout /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 -newkey rsa:4096
    
  5. 现在将提示您输入密码:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_13.jpg

图 12.12 – 证书生成响应,要求输入密码

  1. 您也可能会被提示输入一些有关公司信息的内容。它将使用我们之前填写的默认值,因此您可以直接按Enter,直到常用名称

  2. 常用名称处填写根证书颁发机构,并像这样添加您的电子邮件地址:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_14.jpg

图 12.13 – 证书生成响应,要求输入信息,根证书颁发机构

  1. 接下来是创建 Zabbix 服务器将使用的实际签名证书。让我们确保 OpenSSL 拥有跟踪已签名证书所需的正确文件:

    touch /etc/pki/CA/index.txt
    echo 01 > /etc/pki/CA/serial
    
  2. 然后,创建文件夹以存放我们的证书:

    mkdir /etc/pki/CA/unsigned
    mkdir /etc/pki/CA/newcerts
    mkdir /etc/pki/CA/certs
    
  3. 现在,让我们使用以下命令为lar-book-secure-zbx Zabbix 服务器创建证书签名请求:

    openssl req -nodes -new -keyout /etc/pki/CA/private/zbx-srv_key.pem -out /etc/pki/CA/unsigned/zbx-srv_req.pem -newkey rsa:2048
    
  4. 您将被提示再次输入密码和公司信息。在常用名称之前使用默认设置。我们将填写我们的常用名称,即服务器的主机名,并像这样添加我们的电子邮件地址:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_15.jpg

图 12.14 – 证书生成响应,要求输入信息,lar-book-secure-zbx

  1. 让我们对lar-book-secure-db服务器执行相同的操作:

    openssl req -nodes -new -keyout /etc/pki/CA/private/mysql-srv_key.pem -out /etc/pki/CA/unsigned/mysql-srv_req.pem -newkey rsa:2048
    

    响应将如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/Image96555.jpg

图 12.15 – 证书生成响应请求信息,lar-book-secure-db

重要提示

我们的证书需要在没有密码的情况下创建;否则,MariaDB 和 Zabbix 应用程序将无法使用它们。确保指定 **-**nodes 选项。

  1. 现在,使用以下命令为 lar-book-secure-zbx 签署证书:

    openssl ca -policy policy_anything -days 365 -out /etc/pki/CA/certs/zbx-srv_crt.pem -infiles /etc/pki/CA/unsigned/zbx-srv_req.pem
    
  2. 您将被提示询问签署证书吗?[y/n]。请回答Y,并对所有后续问题也回答Y

  3. 现在,让我们对 lar-book-secure-db 证书做同样的操作:

    openssl ca -policy policy_anything -days 365 -out/etc/ pki/CA/certs/mysql-srv_crt.pem -infiles/etc/pki/CA/ unsigned/mysql-srv_req.pem
    
  4. 让我们登录到 lar-book-secure-db MySQL 服务器,并为我们新创建的证书创建一个目录:

    mkdir /etc/my.cnf.d/certificates/
    
  5. 为文件夹添加正确的权限:

    chown -R mysql. /etc/my.cnf.d/certificates/
    
  6. 现在,回到新的 lar-book-secure-zbx Zabbix 服务器,使用以下命令将文件复制到数据库服务器:

    scp /etc/pki/CA/private/mysql-srv_key.pem root@10.16.16.170:/etc/my.cnf.d/certificates/mysql-srv.key
    scp /etc/pki/CA/certs/mysql-srv_crt.pem root@10.16.16.170:/etc/my.cnf.d/certificates/mysql-srv.crt
    scp /etc/pki/CA/cacert.pem root@10.16.16.170:/etc/my.cnf.d/certificates/cacert.crt
    
  7. 现在,回到 lar-book-secure-db MySQL 服务器,为文件添加正确的权限:

    chown -R mysql:mysql /etc/my.cnf.d/certificates/
    chmod 400 /etc/my.cnf.d/certificates/mysql-srv.key
    chmod 444 /etc/my.cnf.d/certificates/mysql-srv.crt
    chmod 444 /etc/my.cnf.d/certificates/cacert.crt
    
  8. 使用以下命令编辑 MariaDB 配置文件:

    vim /etc/my.cnf.d/server.cnf
    
  9. 在 **[**mysqld] 块下的配置文件中添加以下行:

    bind-address=lar-book-secure-db
    ssl-ca=/etc/my.cnf.d/certificates/cacert.crt
    ssl-cert=/etc/my.cnf.d/certificates/mysql-srv.crt
    ssl-key=/etc/my.cnf.d/certificates/mysql-srv.key
    
  10. 使用以下命令登录 MySQL:

    mysql -u root -p
    
  11. 确保我们的 Zabbix MySQL 用户需要 SSL 加密,使用以下命令:

    alter user 'zabbix'@'10.16.16.152' require ssl;
    flush privileges;
    

    确保 IP 地址与 Zabbix 服务器的 IP 地址匹配(如果它们分开,还要确保 Zabbix 前端的 IP 地址匹配),就像我们在步骤 2中做的那样。

  12. 退出 MariaDB CLI,然后使用以下命令重启 MariaDB:

    systemctl restart mariadb
    
  13. 现在,回到 lar-book-secure-zbx Zabbix 服务器,创建一个新文件夹来存放我们的证书:

    mkdir -p /var/lib/zabbix/ssl/
    
  14. 使用以下命令将证书复制到这个文件夹中:

    cp /etc/pki/CA/cacert.pem /var/lib/zabbix/ssl/
    cp /etc/pki/CA/certs/zbx-srv_crt.pem/var/lib/zabbix/ssl/zbx-srv.crt
    cp /etc/pki/CA/private/zbx-srv_key.pem/var/lib/zabbix/ssl/zbx-srv.key
    
  15. 编辑 Zabbix 服务器配置文件,以便使用这些证书:

    vim /etc/zabbix/zabbix_server.conf
    
  16. 确保以下行与我们的 lar-book-secure-db 数据库服务器的设置匹配:

    DBHost=lar-book-secure-db
    DBName=zabbix
    DBUser=zabbix
    DBPassword=password
    
  17. 现在,确保我们的 SSL 配置与新文件匹配:

    DBTLSConnect=verify_full
    DBTLSCAFile=/var/lib/zabbix/ssl/cacert.pem
    DBTLSCertFile=/var/lib/zabbix/ssl/zbx-srv.crt
    DBTLSKeyFile=/var/lib/zabbix/ssl/zbx-srv.key
    
  18. 同时,请确保为与 SSL 相关的文件添加正确的权限:

    chown -R zabbix:zabbix /var/lib/zabbix/ssl/
    chmod 400 /var/lib/zabbix/ssl/zbx-srv.key
    chmod 444 /var/lib/zabbix/ssl/zbx-srv.crt
    chmod 444 /var/lib/zabbix/ssl/cacert.pem
    
  19. 使用以下命令启动并启用 Zabbix 服务器:

    • 基于 RHEL 的系统:

    • systemctl restart zabbix-server zabbix-agent2 httpd php-fpm

    • systemctl enable zabbix-server zabbix-agent2 httpd php-fpm

    • Ubuntu 系统:

    • systemctl restart zabbix-server zabbix-agent2 apache2 php-fpm

    • systemctl enable zabbix-server zabbix-agent2 apache2 php-fpm

  20. 然后,导航到 Zabbix 前端并填写正确的信息,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_16.jpg

图 12.16 – Zabbix 前端配置,数据库步骤

  1. 当我们点击下一步时,我们需要填写一些更多的信息:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_17.jpg

图 12.17 – Zabbix 前端配置,服务器详情步骤

  1. 然后,在点击下一步下一步完成后,前端应该已经配置好并且能够正常工作。

它是如何工作的……

这是一篇比较长的教程,下面让我们快速总结一下:

  • 步骤 19中,我们准备了我们的服务器

  • 步骤 1037中,我们执行了创建证书所需的所有操作

  • 步骤 3847中,我们为 Zabbix 前端配置了加密

经过这些步骤后,安全地设置 Zabbix 数据库可能看起来是一项艰巨的任务,实际上确实如此。证书、登录程序、大量设置等因素都可能变得非常复杂,这也是我始终建议在尝试自己配置之前深入研究加密方法的原因。

然而,如果您的配置需要加密,本文提供的配置方法是第一次设置的良好起点。它在内部环境中运行良好,因为我们使用的是私有证书。

重要提示

确保更新您的 SSL 证书,因为它们的有效期仅限于我们定义的时长。在这种情况下是 365 天,因此我们每年都会更新一次。一个不错的计划是监控证书的到期日期,并在 Zabbix 中为其创建警报。

除了 Zabbix 服务器与 Zabbix 前端之间的通信外,所有 Zabbix 组件都可以加密,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_18.jpg

图 12.18 – Zabbix 加密方案的可能性

我们已经在以下组件之间设置了加密:

  • Zabbix 服务器和 MariaDB

  • Zabbix 前端和 MariaDB

这意味着,当我们的 Zabbix 服务器或前端请求或写入数据库数据时,它将被加密。因为我们的 Zabbix 应用程序运行在与 Zabbix 数据库不同的服务器上,这一点可能很重要。例如,我们的配置可能是这样的:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/zabbix7-it-infra-mon-cb-3e/img/B19803_12_19.jpg

图 12.19 – 带有外部网络图的 Zabbix 配置

假设云平台的名称是某公司,并且其网络不由我们管理。该网络中有多个交换机和路由器,用于多个具有独立 VLAN 的客户。如果其中某个设备被攻破,我们的所有 Zabbix 数据都可能被他人查看。

即使网络设备是我们的,网络中仍然可能存在被攻破的设备,我们的数据也可能被查看。这就是为什么你可能想要添加加密,以增加额外的安全层。无论是防止其他公司及其网络的入侵,还是防止我们自己出现漏洞,像我们在本教程中做的那样保护数据库,可能会帮助你避免泄露所有数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值