Конфигурирование сервера 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 или другие альтернативы.

Другие вопросы по тегам