如何在Ubuntu16.04上使用Icinga监控主机和服务
介绍
Icinga 是一个开源监控系统,用于监控联网主机和服务的健康状况。 在本教程中,我们将使用 Icinga 设置两种不同的监控配置。 第一种是基于对主机外部服务的简单网络检查,例如定期向您的网站发出 HTTP 请求。 另一种配置使用在主机上运行的软件代理来收集更详细的系统信息,例如负载和正在运行的进程数。
先决条件
在开始本教程之前,您应该已经完成了本系列的上一篇教程,如何在 Ubuntu 16.04 上安装 Icinga 和 Icinga Web。 这将使您拥有在单个主机上运行的 Icinga 核心和 Icinga Web 界面,我们将始终将其称为 icinga-master 节点。
您还需要一些服务器进行监控。 我们将使用两台安装了 Apache 的 Ubuntu 16.04 服务器作为示例。 您可以只使用上面提到的 的 LAMP 教程 的 Apache 部分来设置这些。
第 1 步 – 设置简单的主机监控
使用 Icinga 监视服务器的一种简单方法是设置对其外部可用服务的定期检查。 因此,对于网络主机,我们会定期 ping 服务器的 IP 地址并尝试访问网页。 这将告诉我们主机是否已启动,以及 Web 服务器是否正常运行。
让我们为 Web 服务器设置监控。 选择一个提到的 Apache 服务器作为先决条件,并确保默认的 Apache 占位符页面得到正确服务。 我们将此服务器称为 web-1.example.com
。 我们根本不需要登录,所有的健康检查都将在主节点上配置和执行。
注意: Icinga 总是默认使用它正在处理的任何主机的完全限定域名 (FQDN)。 FQDN 是主机名加上其域名,例如 web-1.example.com
。 如果您没有为主机设置正确的域,则 FQDN 将类似于 web-1.localdomain
。
这些都可以使用,只要保持一致,如果您没有“真正的” FQDN,请始终在您配置的任何 Icinga address
字段中使用服务器的 IP 地址。
登录到主节点。 要添加新主机,我们需要编辑 Icinga 的 hosts.conf
文件。 在文本编辑器中打开它:
sudo nano /etc/icinga2/conf.d/hosts.conf
这将打开一个文件,其中包含一些解释性注释和一个定义的主机 block。 现有的 object Host NodeName
配置块定义了 icinga-master 主机,这是我们安装 Icinga 和 Icinga Web 的主机。 将光标放在文件底部,然后添加一个新主机:
/etc/icinga2/conf.d/hosts.conf
. . . object Host "web-1.example.com" { import "generic-host" address = "web-1_server_ip" vars.http_vhosts["http"] = { http_uri = "/" } vars.notification["mail"] = { groups = [ "icingaadmins" ] } }
这定义了一个名为 web-1.example.com
的主机,从名为 generic-host
的模板导入一些默认主机配置,将 Icinga 指向正确的 IP 地址,然后定义一些变量告诉 Icinga 检查 HTTP响应根 (/
) URL 并在出现问题时通过电子邮件通知 icingaadmins
组。
保存并关闭文件,然后重新启动 Icinga:
sudo systemctl restart icinga2
在浏览器中切换回 Icinga Web 界面。 界面更新速度相当快,因此您无需刷新页面。 新的主机信息应该会在短时间内填充,一旦 Icinga 收集到足够的信息,运行状况检查将从 Pending 变为 Ok。
这是监视主机上的外部服务的好方法,还有其他可用于 SSH 服务器、SMTP 等的检查。 但是,了解有关我们正在监视的服务器的内部运行状况的更多详细信息也很好。
接下来,我们将通过 Icinga 代理设置监控,以便我们可以密切关注更详细的系统信息。
第 2 步 – 设置基于代理的监控
Icinga 提供了一种在主节点和客户端节点之间进行安全通信的机制,以便运行更广泛的远程健康检查。 我们不仅可以知道我们的 Web 服务器正在成功地服务页面,还可以监控 CPU 负载、进程数、磁盘空间等。
我们将设置第二台服务器进行监控。 我们称之为 web-2.example.com
。 我们需要在远程机器上安装 Icinga 软件,运行一些设置向导来建立连接,然后更新 Icinga 主节点上的一些配置文件。
注意: 有很多方法可以构建 Icinga 安装,包括多层 master/satellite/client 节点,高可用性故障转移,以及在节点之间共享配置详细信息的多种方式。 我们正在建立一个简单的两层结构,一个 master 节点和多个 client 节点。 此外,所有配置都将在 master 节点上完成,我们的健康检查命令将在主节点上调度并推送到客户端。 Icinga 项目将此设置称为 Top Down Command Endpoint 模式。
设置主节点
首先,我们需要设置主节点以建立客户端连接。 我们通过在我们的主节点上运行节点设置 wizard 来做到这一点:
sudo icinga2 node wizard
这将启动一个脚本,它会问我们几个问题,并为我们进行设置。 在下文中,我们点击 ENTER
以接受大多数默认值。 突出显示非默认答案。 为清楚起见,删除了一些信息输出:
OutputPlease specify if this is a satellite setup ('n' installs a master setup) [Y/n]: n Starting the Master setup routine... Please specify the common name (CN) [icinga-master.example.com]: ENTER to accept the default, or type your FQDN Checking for existing certificates for common name 'icinga-master.example.com'... Certificates not yet generated. Running 'api setup' now. Enabling feature api. Make sure to restart Icinga 2 for these changes to take effect. Please specify the API bind host/port (optional): ENTER Bind Host []: ENTER Bind Port []: ENTER Done. Now restart your Icinga 2 daemon to finish the installation!
重新启动 Icinga 以完成更新配置:
sudo systemctl restart icinga2
打开防火墙端口以允许外部连接到 Icinga:
sudo ufw allow 5665
现在我们将切换到客户端节点,安装 Icinga 并运行相同的向导。
设置客户端节点
登录到我们调用的服务器 web-2.example.com。 我们需要再次安装 Icinga 存储库,然后安装 Icinga 本身。 这与我们在主节点上使用的过程相同。 首先安装密钥:
curl -sSL https://packages.icinga.com/icinga.key | sudo apt-key add -
打开icinga.list
文件:
sudo nano /etc/apt/sources.list.d/icinga.list
粘贴存储库详细信息:
/etc/apt/sources.list.d/icinga.list
deb https://packages.icinga.com/ubuntu icinga-xenial main
保存并关闭文件,然后更新包缓存:
sudo apt-get update
然后,安装 icinga2
。 注意我们不需要我们在主节点上安装的icinga2-ido-mysql
包:
sudo apt-get install icinga2
现在我们在这台服务器上运行节点向导,但是我们执行 satellite 配置而不是 master:
sudo icinga2 node wizard
OutputPlease specify if this is a satellite setup ('n' installs a master setup) [Y/n]: y Starting the Node setup routine... Please specify the common name (CN) [web-2.example.com]: ENTER Please specify the master endpoint(s) this node should connect to: Master Common Name (CN from your master setup): icinga-master.example.com Do you want to establish a connection to the master from this node? [Y/n]: y Please fill out the master connection information: Master endpoint host (Your master's IP address or FQDN): icinga-master_server_ip Master endpoint port [5665]: ENTER Add more master endpoints? [y/N]: ENTER Please specify the master connection for CSR auto-signing (defaults to master endpoint host): Host [icinga-master_server_ip]: ENTER Port [5665]: ENTER
向导现在将从我们的主节点获取公共证书并向我们显示其详细信息。 确认信息,然后继续:
Output. . . Is this information correct? [y/N]: y information/cli: Received trusted master certificate. Please specify the request ticket generated on your Icinga 2 master. (Hint: # icinga2 pki ticket --cn 'web-2.example.com'):
此时,切换回您的 master
服务器并运行向导提示您执行的命令。 不要忘记前面的sudo
:
sudo icinga2 pki ticket --cn 'web-2.example.com'
该命令将输出一个密钥。 将其复制到剪贴板,然后切换回客户端节点,将其粘贴并点击 ENTER
继续向导。
Output. . . information/cli: Requesting certificate with ticket '5f53864a504a1c42ad69faa930bffa3a12600546'. Please specify the API bind host/port (optional): Bind Host []: ENTER Bind Port []: ENTER Accept config from master? [y/N]: n Accept commands from master? [y/N]: y Done. Now restart your Icinga 2 daemon to finish the installation!
现在打开防火墙上的 Icinga 端口:
sudo ufw allow 5665
并重新启动 Icinga 以完全更新配置:
sudo systemctl restart icinga2
您可以使用 netstat
验证两台服务器之间是否存在连接:
netstat | grep :5665
建立连接可能需要一些时间。 最终 netstat
将输出一行,显示正确端口上的 ESTABLISHED
连接。
Outputtcp 0 0 web-2_server_ip:58188 icinga-master_server_ip:5665 ESTABLISHED
这表明我们的服务器已连接,我们已准备好配置客户端检查。
配置代理监控
即使主服务器和客户端现在已连接,仍然需要在主服务器上进行一些设置以启用监控。 我们需要建立一个新的主机文件。 切换回主节点。
Icinga 安装中一个重要的组织级别是 zone 的概念。 所有客户端节点都必须创建自己的区域,并向父区域报告,在本例中是我们的主节点。 默认情况下,我们的主节点区域以其 FQDN 命名。 我们将在 Icinga 的 zones.d
目录中创建一个以我们的主区域命名的目录。 这将保存所有主区域客户端的信息。
创建区域目录:
sudo mkdir /etc/icinga2/zones.d/icinga-master.example.com
我们将创建一个服务配置文件。 这将定义一些我们将在任何远程客户端节点上执行的服务检查。 现在打开文件:
sudo nano /etc/icinga2/zones.d/icinga-master.example.com/services.conf
粘贴以下内容,然后保存并关闭:
服务配置文件
apply Service "load" { import "generic-service" check_command = "load" command_endpoint = host.vars.client_endpoint assign where host.vars.client_endpoint } apply Service "procs" { import "generic-service" check_command = "procs" command_endpoint = host.vars.client_endpoint assign where host.vars.client_endpoint }
这定义了两个服务检查。 第一个将报告 CPU 负载,第二个将检查服务器上的进程数。 每个服务定义的最后两行很重要。 command_endpoint
告诉 Icinga 需要将此服务检查发送到远程命令端点。 assign where
行自动将服务检查分配给定义了 client_endpoint
变量的任何主机。
现在让我们创建这样一个主机。 在我们之前创建的区域目录中打开一个新文件。 在这里,我们以远程主机命名文件:
sudo nano /etc/icinga2/zones.d/icinga-master.example.com/web-2.example.com<^>.conf
粘贴以下配置,然后保存并关闭文件:
web-2.example.com.conf
object Zone "web-2.example.com" { endpoints = [ "web-2.example.com" ] parent = "icinga-master.example.com" } object Endpoint "web-2.example.com" { host = "web-2_server_ip" } object Host "web-2.example.com" { import "generic-host" address = "web-2_server_ip" vars.http_vhosts["http"] = { http_uri = "/" } vars.notification["mail"] = { groups = [ "icingaadmins" ] } vars.client_endpoint = name }
该文件为我们的远程主机定义了一个区域,并将其绑定回父区域。 它还将主机定义为端点,然后定义主机本身,从 generic-host
模板中导入一些默认规则。 它还设置了一些 vars
来创建 HTTP 检查并启用电子邮件通知。 请注意,由于此主机已定义 vars.client_endpoint = name
,因此还将为其分配我们刚刚在 services.conf
中定义的服务检查。
重启 Icinga 以更新配置:
sudo systemctl restart icinga2
切换回 Icinga Web 界面,新主机将显示检查 Pending。 片刻之后,这些检查应该变成 Ok。 这意味着我们的客户端节点正在成功地对主节点进行检查。
结论
在本教程中,我们使用 Icinga 设置了两种不同类型的监控,外部服务检查和基于代理的主机检查。 有关配置和使用 Icinga 的知识还有很多,因此您可能希望深入了解 Icinga 的大量文档 。
请注意,如果您需要自定义 check 命令,则需要使用 全局配置区域 将这些从主节点同步到客户端节点。 您可以在此处 找到有关此特定功能 的更多信息。
最后,如果您有大量服务器要监控,您可能会考虑使用配置管理软件来自动化您的 Icinga 配置更新。 我们的系列教程 配置管理入门 全面概述了所涉及的概念和软件。