Telegraf 配置的持续部署
作者:Rick Brown / 用例, 产品, 开发者
2019年12月09日
导航至
在我与 Rawkode 分享了我的“使用 Telegraf 作为网关”帖子后,他提到了他给出的一个演讲,其中他讨论了 Telegraf 的高级主题,包括他看到的自动配置正在运行的 Telegraf 实例的要求,只需编辑 GitHub 中的配置文件即可。观看此处的演讲。
我对 Telegraf 重新加载其配置有一些疑问,他回答了这些问题,我想知道我是否已经拥有家庭局域网中运行的所有工具包组件来使其工作。我可以考虑实施持续交付或发布自动化应用程序来执行此操作,但我将考虑使用我已经拥有的工具。
我发现我已经使用了一切我需要的!所以这是一个 Telegraf 的持续部署机制。要复制此机制,您将需要
- Telegraf
- 我主要使用 Linux 服务器,但我有几台 Windows 机器,我在本文后面提到如何包含这些机器
- 对这些机器的 Root 访问权限
- 以更改配置文件
- Node-RED
- 允许动态创建 HTTP 端点的其他应用程序也可以,但我使用 Node-RED
- 呃,就是这样!
当安装在 Linux(Debian - 其他发行版可能会将配置位置放在其他地方)上时,Telegraf 命令行选项读取 /etc/telegraf/telegraf.conf 和 /etc/telegraf/telegraf.d/*.conf。Telegraf 还包括从 HTTP 端点读取其配置的选项,如果您使用 InfluxDB v2,您就会看到这一点。当提示您使用 InfluxDB v2 配置 Telegraf 时,系统会为您提供一个 API 令牌,以存储为您运行 Telegraf 的机器上的环境变量,并且您会看到此命令行
telegraf --config https://InfluxDBCloud2Instance/api/v2/telegrafs/NNN
该命令行将运行 Telegraf(假设它在您的 PATH 中),连接到指定的端点以从那里读取其配置。
那么,如果我使用此配置会发生什么?
/usr/bin/telegraf -config http://192.168.1.8:1880/telegraf/myhost
这应该连接到端口 1880(Node-RED 端口)上该 IP 地址(我的 Node-RED 服务器),连接到端点 /telegraf/myhost。如果我可以让 Node-RED 响应 /telegraf/myhost 上的 Web 请求,我应该能够向 Telegraf 发送配置。
Node-RED http-in 和 http-out 节点旨在完全做到这一点。
下一个挑战是,我的每个 Telegraf 实例可能都想要不同的配置集,因此我希望 Node-RED 了解哪个 Telegraf 实例正在调用它,并相应地更改配置。Telegraf 将发送 GET 请求,因此它需要确保 URL 在某种程度上是唯一的。
之后,我希望 Node-RED 提供更新的配置,以便在我更改任何配置时使用,因此我需要让 Node-RED 定期刷新其配置。合理的刷新时间可能是多少?我将选择 10 分钟。
然后我希望每个 Telegraf 实例都刷新配置,以便一切自动化。合理的刷新时间可能是多少?我将尝试一小时。
当然,我希望所有这些东西都在不暴露任何敏感配置信息的情况下运行,因此我需要让 Node-Red 修改任何检索到的配置,以添加个人信息,例如 InfluxDB v2 API 令牌。
这真是一个我需要做的事情的工具包,所以让我们开始吧!
首先,Telegraf 端
我在所有 LXC 容器中都从 systemd 运行 Telegraf,因此它会在启动时自动运行。因此,Telegraf 的配置位于 systemd 目录中。如果您手动运行 Telegraf、在使用 sysvinit 的系统上运行或从 Docker 运行,则需要进行相应的修改,但对于我的配置,我需要编辑位于此处的 Telegraf 服务文件
/lib/systemd/system/telegraf.service
将该文件复制到 /etc,以便在更新 Telegraf 时保留它
cp /lib/systemd/system/telegraf.service /etc/systemd/system
现在编辑新文件。ExecStart 行显示将运行 Telegraf 的命令行,带有 -config 和 -config-directory 选项。将其更改为以下内容
ExecStart=/usr/bin/telegraf -config http://192.168.1.8:1880/telegraf/%H $TELEGRAF_OPTS
注意 %H。它是 systemd 中的一个特殊属性,意思是“用这台机器的主机名替换它”,因此每台机器都会请求自己的配置集。这应该足够唯一性了 - 如果我想要在一台机器上实现 Telegraf 的多个实例,或者扩展此机制以包含环境定义,我将研究 systemd 中的抽象,以从 EnvironmentFile 条目而不是使用 %H 中检索变量。
查看该文件中的下一行
ExecReload=/bin/kill -HUP $MAINPID
这表明“systemctl reload”命令将向 Telegraf 发送 SIGHUP 信号,该信号旨在使 Telegraf 刷新其配置。我想每小时执行一次。Linux 机器运行 cron 进行定期自动化任务,因此我们可以使用此功能。创建文件 /etc/cron.hourly/telegraf 并将以下行放入其中
#!/bin/bash -e
# random sleep (max 5 min) to prevent clients from hitting the server at the same time
SLEEP=$[ ($RANDOM % 300) ] && sleep $SLEEP
systemctl reload telegraf
这将导致 Telegraf 每 60-65 分钟重新加载其配置。
使该文件可执行
这将导致 Telegraf 每 60-65 分钟重新加载其配置。
使该文件可执行
chmod +x /etc/cron.hourly/telegraf
注释
- 如果您的文件名使用标点符号,它将被 cron 拒绝。无法运行 telegraf.runthis 文件 - 只需保持文件名简单。
- 如果您希望您的配置重新加载发生在与每小时不同的时间尺度上,则 cron 系统的其他部分可以实现这一点,因此您可以编辑 crontab、cron.daily 等。
现在运行两个命令
systemctl daemon-reload
systemctl restart telegraf
并且 Telegraf 现在将在其日志文件中抱怨它无法从任何地方获取配置。我们最好跳转到 Node-RED 并解决这个问题!
在我们离开之前,为在 Windows 上运行 Telegraf 的读者快速注意一下。编辑注册表,转到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\telegraf
将 ImagePath 更改为此(将 IP 地址更改为您自己的 Node-RED 服务器的 IP 地址)
"C:\Program Files(x86)\Telegraf\telegraf.exe" --config
"http://192.168.1.8:1880/telegraf/%ComputerName%"
要么重新启动,要么运行“服务”并重新启动 Telegraf。
这不会导致 Telegraf 在 Windows 中定期重新加载其配置。只需重新启动 PC 或重新启动 Telegraf 服务即可实现此目的。
现在,让我们运行到 Node-RED。
在 Node-RED 中创建一个新选项卡。将所需的节点添加到其中以进行配置。
第一个节点“时间戳”每 10 分钟更新一次配置。
下一个节点设置私有设置的属性。这些是“更改”节点,我将在其中添加所有个人信息,用于连接和验证我的 InfluxDB Cloud 实例。它们看起来像这样
现在我们需要从存储配置的任何位置检索配置。我创建了这样的节点
这是您可以真正发挥创意的时候!您可能想要将您的配置存储在 GitHub 或 GitLab 中,或者您可能热衷于软件定义网络(配置即服务),因此想要通过消息传递主题之类的东西发送更新。更新的配置数据可以来自许多地方,Node-RED 中唯一的区别是用于更新配置信息的节点类型
我更喜欢使用 Node-RED 直接存储我的配置,因此我的配置节点看起来像这样
注意选项 urls
、database
、username
和 password
的“mustache”模板。这些信息片段是从“更改”节点检索并插入到此处的,因此数据始终正确且最新。
一个模板节点中可以存在多个配置片段。根据您的喜好创建每个模板节点,以获得最佳可读性、理解和适当的重用,例如这个用于一组核心监控输入的模板节点
在部署流之后,我们所有的配置片段都加载到 Node-RED 中,并每 10 分钟刷新一次。最后的任务是为 Telegraf 提供一个网页以供使用
此流中的第一个节点是“http-in”节点。它侦听 http://192.168.1.8:1880/telegraf/:hostname 上的 GET 请求。
:hostname
自动成为 Node-RED 中的一个属性,我们将在“按主机名选择”Switch 节点中使用它。还记得我们使用 %H 配置 Telegraf 吗?该参数替换就是我们在此处使用的。
Switch 节点与主机名匹配,并为每个主机将请求发送到特定路径。
作为遵循工作流程的示例,让我们看看主机“mqtt”会发生什么。在 Switch 节点选择“mqtt”路径后,它接下来转到“MQTT 配置”模板节点,该节点为我的 MQTT 实施启用特定的监控配置。
该配置包含我的 ActiveMQ 和 Jolokia-2 配置信息(我使用 ActiveMQ 作为我的 MQTT 代理,因为它具有监控挂钩和所有我正在使用的主题的内置视图,以及指示有多少订阅者正在收听每个主题)。然后工作流程转到 Linux 配置节点,该节点插入我想要使用的所有标准 Linux 监控配置,并在末尾附加 MQTT 配置
最后一步是“http-out”节点,它使用所需的配置数据响应原始请求者。
每隔几分钟,Node-Red 就会记录已建立连接并且已提供新配置
从 Telegraf 端来看,这看起来如何?这是来自名为“mqtt”的服务器的 telegraf.log 的一部分,它显示了当 reload 命令发送到 Telegraf 时会发生什么,它如何在重新启动并加载所有更新的输入和输出之前将所有缓冲点写入 InfluxDB。
请注意,重新加载后的第一个输出包含的点比重新加载之前的输出更多。这是 Telegraf 处理在重新加载其配置时缓冲的输入。在测试期间,我注意到,如果我在 HTTP 上写入 Telegraf 实例,同时它正在重新加载其配置,则 HTTP 端口未打开,因此这可能是确定重新加载配置频率的一个考虑因素。
因此,我所有的 Telegraf 实例现在每小时更新一次其运行配置,这意味着我可以根据需要调整我的抖动和缓冲区,并且我可以根据需要更新我的配置,对于每个 Telegraf 实例、实例子集或单独实例,都无需登录服务器。
Node-RED 甚至可以配置为将您的选项卡提交到版本控制,因此所有配置都是安全可靠的。
实际上,我刚刚配置了 Node-RED-to-Telegraf 作为配置管理/变更管理/持续部署系统运行,所有这些都通过使用基于模型的流程的 UI 元素完成,而无需编写单行代码。
我不知道我是否会继续使用这种机制来配置 Telegraf,我是否会使用 Telegraf 网关 机制,或者我是否会结合使用两者。我现在将运行一种组合,并在稍后重新审视此问题,以确定最适合我的用例的部署机制。