我计划将AWS自动缩放组用于我的网络服务器。作为监控解决方案,我目前正在使用munin。在munin主服务器上的配置文件中,您必须为要监视的每个主机提供IP地址或主机名。
现在使用自动缩放功能,实例数将经常更改,并且在munin配置中编写静态信息似乎不适合此环境。我可能会查询我要监视的所有服务器地址,然后编写munin主配置文件,但这对我来说似乎不是一个好方法。
在这样的环境中使用munin的首选方式是什么?有人使用munin进行自动缩放吗?
一般情况下,我想继续使用munin而不是切换到另一种监控解决方案,因为我编写了很多我依赖的特定插件。但是,如果你有另一个监控解决方案,可能会让我保留我的插件,我也是开放的。
答案 0 :(得分:0)
一年前,我们使用munin作为替代监控系统,我会告诉你一个:我根本不喜欢它。 我们在nagios中也有一些自动缩放系统的自动化,但这也是监视大量AWS实例的难看方式,因为在一些监视实例之后,nagios开始滞后/崩溃。
如果您有超过150-200个实例要监控,我建议您使用某些商业服务,例如StackDriver或其他替代方案。
答案 1 :(得分:0)
我偶然发现了这个老话题,因为我正在寻找解决同一问题的方法。最终,我找到了一种对我有用的方法,我想与您分享。 tl; dr摘要
最后,这是我的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端口的检查。
希望这会有所帮助。
干杯, 奥利弗