3

ウェブサーバーに AWS 自動スケーリング グループを使用する予定です。監視ソリューションとして、現在 munin を使用しています。munin マスター サーバーの構成ファイルでは、監視するすべてのホストの IP アドレスまたはホスト名を指定する必要があります。

現在、自動スケーリングによりインスタンスの数が頻繁に変化し、munin 構成に静的情報を書き込むことは、この環境にはあまり適していないようです。おそらく、監視したいすべてのサーバーアドレスを照会して、munin マスター構成ファイルを書き込むことができますが、これは私には良いアプローチとは思えません。

そのような環境で munin を使用する好ましい方法は何ですか? 誰かが自動スケーリングで munin を使用していますか?

一般的に、依存する特定のプラグインをかなり多く作成したため、別の監視ソリューションに切り替えるのではなく、munin を使用し続けたいと考えています。ただし、おそらくプラグインを保持できる別の監視ソリューションがある場合は、それも受け入れます。

4

2 に答える 2

0

同じ問題の解決策を探していたので、この古いトピックに出くわしました。最後に、私はあなたと共有したい私のために働く方法を見つけました. tl;dr の概要

  • AWS Python API を使用して、munin マスターが存在する同じ VPC 内のすべてのインスタンスを取得します
  • muninノードを検出するために見つかったインスタンスでmuninポート4949が開いているかどうかをテストします
  • munin.base.conf (ノードなし) から munin.conf を作成し、見つかったすべてのノードのエントリを追加します。
  • cron を介して munin master でスクリプトを 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')

API 呼び出しを機能させるには、AWS API 資格情報をセットアップするか、必要なアクセス許可 (最低限として ec2:DescribeInstances) を持つ IAM ロールを munin マスター インスタンスに割り当てる必要があります (これは私の好みの方法です)。

いくつかの最終実装ノート:

内部 DNS ホスト名を保持するすべての AWS インスタンスに割り当てられた CNAME という名前のタグがあります。したがって、このタグをフィルタリングし、その値を munin 構成のノード名とアドレスとして使用します。おそらく、セットアップのためにこれを変更する必要があります。

もう 1 つのオプションは、munin で監視するすべてのインスタンスに特定のタグを割り当てることです。次に、このタグをフィルタリングして、開いている munin ポートのチェックをスキップすることもできます。

これが役立つことを願っています。

乾杯、 オリバー

于 2019-08-14T17:08:57.300 に答える