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