配置munin服务器以用于AWS自动扩展?

时间:2013-10-22 09:16:33

标签: amazon-web-services monitoring autoscaling munin

我计划将AWS自动缩放组用于我的网络服务器。作为监控解决方案,我目前正在使用munin。在munin主服务器上的配置文件中,您必须为要监视的每个主机提供IP地址或主机名。

现在使用自动缩放功能,实例数将经常更改,并且在munin配置中编写静态信息似乎不适合此环境。我可能会查询我要监视的所有服务器地址,然后编写munin主配置文件,但这对我来说似乎不是一个好方法。

在这样的环境中使用munin的首选方式是什么?有人使用munin进行自动缩放吗?

一般情况下,我想继续使用munin而不是切换到另一种监控解决方案,因为我编写了很多我依赖的特定插件。但是,如果你有另一个监控解决方案,可能会让我保留我的插件,我也是开放的。

2 个答案:

答案 0 :(得分:0)

一年前,我们使用munin作为替代监控系统,我会告诉你一个:我根本不喜欢它。 我们在nagios中也有一些自动缩放系统的自动化,但这也是监视大量AWS实例的难看方式,因为在一些监视实例之后,nagios开始滞后/崩溃。

如果您有超过150-200个实例要监控,我建议您使用某些商业服务,例如StackDriver或其他替代方案。

答案 1 :(得分:0)

我偶然发现了这个老话题,因为我正在寻找解决同一问题的方法。最终,我找到了一种对我有用的方法,我想与您分享。 tl; dr摘要

  • 使用AWS Python API在munin主设备所在的同一VPC中获取所有实例
  • 在找到的用于检测munin节点的实例上测试munin端口4949是否已打开
  • 从munin.base.conf(无节点)创建munin.conf,并为找到的所有节点附加条目
  • 全部5分钟通过cron在munin主机上运行脚本

最后,这是我的Python脚本,可完成所有魔术工作:

#! /usr/bin/python

import boto3
import requests
import argparse
import shutil
import socket

socketTimeout = 2

ec2 = boto3.client('ec2')


def getVpcId():

        response = requests.get('http://169.254.169.254/latest/meta-data/instance-id')
        instance_id = response.text

        response = ec2.describe_instances(
                Filters=[
                        {
                                'Name' : 'instance-id',
                                'Values' : [ instance_id ]
                        }
                ]
        )

        return response['Reservations'][0]['Instances'][0]['VpcId']




def findNodes(tag):

        result = []

        vpcId = getVpcId()

        response = ec2.describe_instances(
                Filters=[
                        {
                                'Name' : 'tag-key',
                                'Values' : [ tag ]
                        },
                        {
                                'Name' : 'vpc-id',
                                'Values' : [ vpcId ]
                        }
                ]
        )

        for reservation in response['Reservations']:
                for instance in  reservation['Instances']:
                        result.append(instance)

        return result


def getInstanceTag(instance, tagName):

        for tag in instance['Tags']:
                if tag['Key'] == tagName:
                        return tag['Value']

        return None


def isMuninNode(host):

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(socketTimeout)

        try:
                s.connect((host, 4949))
                s.shutdown(socket.SHUT_RDWR)
                return True
        except Exception as e:
                return False
        finally:
                s.close()

def appendNodesToConfig(nodes, target, tag):

        with open(target, "a") as file:
                for node in nodes:
                        hostname = getInstanceTag(node, tag)

                        if hostname.endswith('.'):
                                hostname = hostname[:-1]

                        if hostname <> None and isMuninNode(hostname):
                                file.write('[' + hostname + ']\n')
                                file.write('\taddress ' + hostname + '\n')
                                file.write('\tuse_node_name yes\n\n')


parser = argparse.ArgumentParser("muninconf.py")
parser.add_argument("baseconfig", help="base munin config to append nodes to")
parser.add_argument("target", help="target munin config")
args = parser.parse_args()
base = args.baseconfig
target = args.target


shutil.copyfile(base, target)

nodes = findNodes('CNAME')
appendNodesToConfig(nodes, target, 'CNAME')

要使API调用起作用,您必须设置munin主实例(这是我的首选方法)的AWS API凭证或将具有所需权限(最低要求为ec2:DescribeInstances)的IAM角色分配。

一些最终实施说明:

我为我的所有AWS实例分配了一个名为CNAME的标签,其中包含内部DNS主机名。因此,我对此标签进行了过滤,并将该值用作munin配置的节点名称和地址。您可能需要为设置进行更改。

另一个选择是为要使用munin监视的所有实例分配一个特定的标签。然后,您可以过滤该标签,并且可能还跳过对munin端口的检查。

希望这会有所帮助。

干杯, 奥利弗