Конфигурирование сервера munin для использования с автомасштабированием AWS?
Я планирую использовать группы автомасштабирования AWS для своих веб-серверов. В качестве решения для мониторинга я сейчас использую munin. В файле конфигурации на главном сервере munin вы должны указать IP-адреса или имена хостов для каждого хоста, который вы хотите отслеживать.
Теперь с автоматическим масштабированием количество экземпляров будет часто меняться, и запись статической информации в конфигурацию munin, похоже, не очень хорошо вписывается в эту среду. Я мог бы, вероятно, запросить все адреса серверов, которые я хочу отслеживать, и написать главный файл конфигурации munin, но это не очень хороший подход для меня.
Каков предпочтительный способ использования мунина в такой среде? Кто-то использует мунин с автомасштабированием?
В общем, я хотел бы продолжать использовать munin и не переключаться на другое решение для мониторинга, потому что я написал довольно много специфических плагинов, на которые я полагаюсь. Однако, если у вас есть другое решение для мониторинга, которое, вероятно, позволит мне сохранить мои плагины, я также открыт для этого.
1 ответ
Я наткнулся на эту старую тему, потому что я искал решение той же проблемы. Наконец, я нашел способ, который работает для меня, которым я хотел бы поделиться с вами. Tl; Dr резюме
- используйте API-интерфейс AWS Python для получения всех экземпляров в одном и том же VPC, в котором находится мастер munin
- проверить, открыт ли порт munin 4949 в найденных экземплярах для обнаружения узлов munin
- создать munin.conf из munin.base.conf (без узлов) и добавить записи для всех найденных узлов
- запусти скрипт на munin master все 5 минут через cron
Наконец, вот мой скрипт на 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 работали, вы должны настроить учетные данные API AWS или назначить роль IAM с необходимыми разрешениями (ec2:DescribeInstances как минимум) для вашего основного экземпляра munin (который является моим предпочтительным методом).
Некоторые заключительные замечания по реализации:
У меня есть тег с именем CNAME, назначенный всем моим экземплярам AWS, который содержит внутреннее имя хоста DNS. Поэтому я фильтрую этот тег и использую значение в качестве имени узла и адреса для конфигурации munin. Возможно, вам придется изменить это для вашей настройки.
Другой вариант - назначить определенный тег всем экземплярам, которые вы хотите отслеживать с помощью munin. Затем вы можете отфильтровать этот тег и, возможно, также пропустить проверку открытого порта munin.
Надеюсь, это поможет.
Ура, Оливер
Год назад мы использовали munin в качестве альтернативной системы мониторинга, и я скажу вам одно: мне это совсем не нравится. У нас была некоторая автоматизация для системы автоматического масштабирования и в nagios, но это также уродливый способ отслеживать большое количество экземпляров AWS, потому что nagios начинает зависать / зависать после некоторого количества экземпляров мониторинга.
Если у вас есть более 150-200 экземпляров для мониторинга, я предлагаю вам использовать некоторые коммерческие сервисы, такие как StackDriver или другие альтернативы.