同じ問題の解決策を探していたので、この古いトピックに出くわしました。最後に、私はあなたと共有したい私のために働く方法を見つけました. 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 ポートのチェックをスキップすることもできます。
これが役立つことを願っています。
乾杯、 オリバー