我使用 Amazon EC2 运行我的移动应用程序。根据特定时间应用程序的负载,我可能会创建新实例,然后在负载较低时关闭它们以节省成本。
在如此动态的环境中,如何跟上 Nagios 配置?当处理托管硬件时,配置文件是可预测的。在这种情况下,需要添加 Nagios、Capistrano 和一堆其他配置文件。Capistrano 需要知道将新构建部署到应用服务器的位置。Nagios 需要知道删除现有实例或添加新实例进行监控。Nagios 还需要知道节点是否被故意关闭或主机是否因错误而关闭。
在 VPS/动态实例的奇妙世界中如何实现这一点?
答案1
我们使用配置管理工具(在我们的例子中是 Chef),它从节点信息中写出 Nagios 配置。
答案2
编写了一套自己的 php 脚本,将 nagios 配置写入文件。Nagios 很简单,因为它只是一个文本文件,所以您需要做的就是为每种类型的服务器创建一个模板。然后,当服务器启动时,使用模板添加一个文件。文件中唯一改变的数据是主机 ip 和名称。
对于更多静态服务器,我创建了一个脚本,该脚本运行ec2-describe-instances
并为返回的每个实例创建一个文件。每个实例都标有标签:Purpose=XXXX,这样我就知道要应用哪个模板。
对于我们的自动扩展组,我们使用命令设置通知as-put-notification-configuration
,该命令将消息发送到 SQS 队列。php 脚本由 crontab 执行。脚本执行时,它会检查队列中是否有任何新服务器。每当它发现新服务器时,它都会创建一个新文件。当服务器被删除时也会发生同样的情况。如果您已经在使用 Chef 或其他程序,那么使用它可能会更容易,但如果您没有使用,您可以在几天内编写一个像我这样的简单 php 服务。
答案3
我们用Opsview,这是另一个 nagios+database+rest-api 包装器。我不知道这是否是所有人(甚至我们)的最佳解决方案,但它允许我们在 Nagios 服务器启动时通过节点(或其他管理节点)的简单 REST API 动态配置 Nagios 服务器,并在完成后将其从配置中删除。我使用主机模板的定义作为 Opsview(/Nagios)服务器的 Puppet 清单的一部分,受监控的主机只需向其注册并加入正确的主机模板作为其 Puppet 清单的一部分。
一种更“通用”的方法,应该可以与几乎所有东西兼容,甚至是原始的 Nagios 及其静态文件,它是Puppet 存储配置- 这允许您根据 Puppet 从其清单中收集的信息编写脚本来配置您想要的任何工具。
我建议,出于取证目的,您不应该在节点关闭时完全删除节点的配置,而应该尝试将其和启动时收集的有关它的监控信息存档。
答案4
我没有灵丹妙药来解决 nagios 的这个问题。但对于 capistrano 来说,有capify-ec2,capistrano 的一个扩展,使用亚马逊标记功能解决服务器角色列表问题。