Salt(Saltstack)可以收集并传输Graphite,Ganglia或Zenoss的数据吗?

我正在开始一个新的项目,并考虑使用Ansible或Salt来实现部署自动化,或者更复杂的编排(服务器pipe理和联合)。

用Salt我想知道是否有任何与Graphite或Zenoss或Ganglia之间的集成…使用Salt 0mq连接将数据从Salt“ minions”转发到监视/graphics数据库/收集器。

有没有其他人看过这个?

我用了超过6个月的盐堆来pipe理40多个节点。

在我目前的设置我使用:

  • Icinga作为监控服务器
  • NRPE在节点上执行检查
  • 石墨从收集的节点收集数据
  • 收集和推动石墨的指标
  • gdash提供了一个不错的仪表板来可视化grahite指标
  • salt-stack ,最后salt-stack在每个节点上推出NRPE / Collectd的configuration

这个在CentOS 6.x下运行

到目前为止,我的经验是,盐堆注册一切都很好。 但是由于长期在节点上运行守护进程,其不稳定。

我经常遇到的问题是没有达到盐师傅的主人或内存膨胀。 这可以解决,简单的解决方法,你每24小时/一周重新启动salt-minions。

但是这个盐问题的问题使得它不能用于通过0mq框架收集数据。

我目前的设置运行安全。 我可以用salt-stack很快地注册更改,并在节点上收集这些信息。

我认为Salt或Ansible不是为这个任务而创build的,我认为他们不能用于这个目的。

我使用了几个月的盐,我没有注意到你想要的function的选项(在configuration和文档)。 但是我认为你可以“添加”你的需求,因为Salt是用python编写的 – 如果它是一个选项。

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

编辑:我发现一个项目,实施监测使用盐 – 鲑鱼 – 看看。

您可能想看看Sensu ,这是一个可以插入大量社区插件(包括石墨等)的监控解决scheme。

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

我build议你看看两件事情:盐矿 – http://docs.saltstack.com/topics/mine/ Salt Events – http://docs.saltstack.com/topics/event/index.html

如果将这些结果与您自己的返回configuration设置结合起来,将结果保存为石墨或您列出的任何其他结果。 你可以想象用Salt来处理自上而下的“探索”和自下而上的“事件”。 我不能评论这种制度的有效性,但原则上似乎是有可能的。

我概述了我在这里通过salt-mine和check_mk进行亚秒级监测的旅程: http ://garthwaite.org/saltmine_check_mk_agent.html

这篇文章经过几个星期的修改,以使其全部工作。 我将总结解决scheme:

为所有小兵创build一个自定义的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" 

configuration监控服务器将所有minion的check_mk_agent输出结果放入一个json文件,然后configurationcheck_mk来查询该文件而不是任何networking查询。 所有这些都是通过以下脚本完成的:

 #!/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 ), ]