Salt(Saltstack)可以为 Graphite、Ganglia 或 Zenoss 收集和传递数据吗?

Salt(Saltstack)可以为 Graphite、Ganglia 或 Zenoss 收集和传递数据吗?

我正在开始一个新项目并考虑使用Ansible或者用于部署自动化以及可能更复杂的编排(服务器管理和联合)。

我想知道 Salt 和石墨或者芝诺斯或者神经节...使用 Salt0mq连接将数据从 Salt“minions”中继到监控/图形数据库/收集器。

还有其他人看过这个吗?

答案1

我使用 salt-stack 已有 6 个多月了,管理 40 多个节点。

在我当前的设置中我使用:

  • 伊辛加作为监控服务器
  • 国家可再生能源计划用于在节点上执行检查
  • 石墨从 collectd 节点收集数据
  • 收集用于收集和推送指标至 Graph
  • 格达什获得一个美观的仪表板来可视化 Grahite 指标
  • 盐栈最后使用 salt-stack 在每个节点上推出 NRPE / Collectd 的配置

它也运行在 CentOS 6.x 下

根据我目前的经验,salt-stack 可以很好地注册所有内容。但是作为节点上长期运行的守护进程,它并不稳定。

我经常遇到无法访问 master 或 salt-minions 内存膨胀的问题。这个问题可以通过一个简单的解决方法来解决,即每 24 小时/每周重启一次 salt-minions。

但是salt-minion中的这个问题导致它无法通过0mq框架收集数据。

我当前的设置运行安全。我可以使用 salt-stack 快速注册更改,节点上的 collectd 可以解决问题。

答案2

我认为 Salt 或 Ansible 不是为该任务创建的,并且我认为它们不能用于该目的。

我使用 Salt 已有几个月了,但我没有注意到您想要的功能选项(在配置或文档中)。但我认为您可以“添加”您的要求,因为 Salt 是用 Python 编写的 - 如果这是一个选项的话。

最简单的方法是订购 salt 来安装收集它可以收集有关系统的数据(并且有与石墨的连接器)

编辑:我发现了一个使用盐实现监控的项目-三文鱼- 看一看。

答案3

你可能想看看仙须,它是一个可插入大量社区插件的监控解决方案,包括石墨等等。

然而 Sensu 使用另一个消息队列来传递消息,RabbitMQ。可能需要一些编码工作,但您可以尝试替换两个消息队列中的一个,因为它们都应该使用 AMQ 协议来交换消息。

答案4

我在这里概述了通过 salt-mine 和 check_mk 实现每主机亚秒级 nagios 监控的历程: http://garthwaite.org/saltmine_check_mk_agent.html

本文介绍了几周来断断续续的修修补补,以使其全部正常工作。我将总结解决方案:

为所有 minions 创建自定义 check_mk 模块:

#!/usr/bin/env python
''' Support for running check_mk_agent over salt '''
import os
import salt.utils
from salt.exceptions import SaltException

def __virtual__():
    ''' Only load the module if check_mk_agent is installed '''
    if os.path.exists('/usr/bin/check_mk_agent'):
        return 'check_mk'
    return False

def agent():
    ''' Return the output of check_mk_agent '''
    return __salt__['cmd.run']('/usr/bin/check_mk_agent')

设置minion的挖矿间隔为一分钟:

salt '*' file.append /etc/salt/minion.d/mine.conf "mine_interval: 1"

配置监控服务器以将所有 minion 的 check_mk_agent 输出拉取到单个 json 文件中,然后配置 check_mk 以查询该文件而不是任何网络查询。所有这些都通过监控 minion 上的以下脚本完成:

#!/usr/bin/env python
import sys
import json
import fcntl

DATAFILE="/dev/shm/cmk.json"
NAG_UID = 105
NAG_GID = 107

def do_update():
    import os
    import salt.client

    caller = salt.client.Caller()
    data = caller.function('mine.get', '*', 'check_mk.agent')

    lockfile = open(DATAFILE+".lock", "w")
    fcntl.flock(lockfile, fcntl.LOCK_EX)

    datafile = open(DATAFILE, "w")
    datafile.write(json.dumps(data))

    for f in (DATAFILE, DATAFILE+".lock"):
        os.chmod(f, 0644)
        os.chown(f, NAG_UID, NAG_GID)

def get_agent(minion):
    lockfile = open(DATAFILE+".lock", "w")
    fcntl.flock(lockfile, fcntl.LOCK_SH)

    data = json.load(file(DATAFILE))
    return data[minion]

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "Usage: mine_agent.py --update | <minion id>"
    elif sys.argv[1] in ['--update', '-u']:
        do_update()
    else:
        minion = sys.argv[1]
        print get_agent(minion)

每分钟更新一次:

$ cat /etc/cron.d/retrieve_mined_minion_data
*/1 * * * * root /etc/check_mk/mine_agent.py --update

最后:在 /etc/check_mk/main.mk 中更改所有 nagios 目标的数据源:

datasource_programs = [
  ( '/etc/check_mk/mine_agent.py <HOST>', ['mine'], ALL_HOSTS ),
]

相关内容