Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 配置munin服务器以便与AWS自动缩放一起使用?_Amazon Web Services_Monitoring_Autoscaling_Munin - Fatal编程技术网

Amazon web services 配置munin服务器以便与AWS自动缩放一起使用?

Amazon web services 配置munin服务器以便与AWS自动缩放一起使用?,amazon-web-services,monitoring,autoscaling,munin,Amazon Web Services,Monitoring,Autoscaling,Munin,我计划在我的Web服务器上使用AWS自动缩放组。作为监控解决方案,我目前正在使用munin。在munin主服务器上的配置文件中,必须为要监视的每个主机提供IP地址或主机名 现在,随着自动缩放,实例的数量将频繁变化,在munin配置中写入静态信息似乎不适合这种环境。我可能可以查询所有我想要监视的服务器地址,然后编写munin主配置文件,但这对我来说似乎不是一个好方法 在这种环境下,使用munin的首选方式是什么?是否有人将munin用于自动缩放 总的来说,我希望继续使用munin,而不是切换到另一

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

现在,随着自动缩放,实例的数量将频繁变化,在munin配置中写入静态信息似乎不适合这种环境。我可能可以查询所有我想要监视的服务器地址,然后编写munin主配置文件,但这对我来说似乎不是一个好方法

在这种环境下,使用munin的首选方式是什么?是否有人将munin用于自动缩放


总的来说,我希望继续使用munin,而不是切换到另一个监控解决方案,因为我编写了很多我所依赖的特定插件。然而,如果你有另一个监控解决方案,可能会让我保留我的插件,我也愿意这样做。

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


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

我偶然发现了这个老话题,因为我正在寻找解决同一问题的方法。最后,我找到了一种适合我的方法,我想与大家分享。tl;dr摘要

  • 使用AWS Python API获取munin主机所在VPC中的所有实例
  • 测试发现的用于检测munin节点的实例上的munin端口4949是否打开
  • 从munin.base.conf(无节点)创建munin.conf,并为找到的所有节点追加条目
  • 通过cron在munin主机上运行脚本5分钟
最后,这里是我的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')

#/usr/bin/python
进口boto3
导入请求
导入argparse
进口舒蒂尔
导入套接字
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.description\u实例(
过滤器=[
{
“名称”:“实例id”,
“值”:[instance_id]
}
]
)
返回响应['Reservations'][0]['Instances'][0]['VpcId']
def findNodes(标记):
结果=[]
vpcId=getVpcId()
response=ec2.description\u实例(
过滤器=[
{
“名称”:“标记键”,
“值”:[标记]
},
{
“名称”:“专有网络id”,
“值”:[vpcId]
}
]
)
对于响应的预订[“预订”]:
例如,在预订['Instances']中:
result.append(实例)
返回结果
def getInstanceTag(实例,标记名):
对于实例['Tags']中的标记:
如果标记['Key']==标记名:
返回标记['Value']
一无所获
def ISMUNINODE(主机):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 设置超时(socketTimeout)
尝试:
s、 连接((主机,4949))
s、 关闭(插座关闭)
返回真值
例外情况除外,如e:
返回错误
最后:
s、 关闭()
def appendNodesToConfig(节点、目标、标记):
打开(目标,“a”)作为文件:
对于节点中的节点:
hostname=getInstanceTag(节点、标记)
如果hostname.endswith('.'):
主机名=主机名[:-1]
如果主机名为None,且isMuninNode(主机名):
file.write('['+hostname+']\n')
file.write('\t地址'+hostname+'\n')
file.write('\tuse\u node\u name yes\n\n')
parser=argparse.ArgumentParser(“munincof.py”)
parser.add_参数(“baseconfig”,help=“base munin config to append nodes to”)
parser.add_参数(“target”,help=“target munin config”)
args=parser.parse_args()
base=args.baseconfig
target=args.target
shutil.copyfile(基本、目标)
nodes=findNodes('CNAME')
appendNodesToConfig(节点,目标,'CNAME')
要使API调用正常工作,您必须设置AWS API凭据,或向您的munin主实例(这是我首选的方法)分配具有所需权限的IAM角色(ec2:至少描述实例)

一些最后实施说明:

我有一个名为CNAME的标记分配给我的所有AWS实例,其中包含内部DNS主机名。因此,我筛选该标记,并使用该值作为munin配置的节点名称和地址。您可能必须更改此设置

另一种选择是为您希望使用munin监视的所有实例分配一个特定的标记。然后,您可以筛选此标记,也可以跳过对打开的munin端口的检查

希望这能有所帮助

干杯,
奥利弗

好问题。我正在关注这个帖子。我也在寻找解决方案。你解决问题了吗?你能分享你的结论吗?不,还没有解决。我们没有实现自动缩放,但对于静态服务器,我们仍然使用munin。然而,对于警报和相应的操作,我们发现Cloudwatch更适合。