Help us understand the problem. What is going on with this article?

mackerel-agentでhost idの重複を避ける

More than 3 years have passed since last update.

Mackerel Advent Calendar 2015 15日目の記事です。

mackerel-agentを起動すると、/var/lib/mackerel-agent/id というファイルにMackerel側でホストを識別するための ID が書き込まれます。

このファイルが残ったままイメージファイルを作成して別のホストを立てた場合、Mackerel側ではホストの識別ができず、実際には複数ホストのホストが存在していても1ホストとして認識されてしまいます。

イメージ作成前に削除する手はありますが、そうするとそのホストで mackerel-agent を起動し直した場合に別ホストとして登録されてしまうので困りますね。

ということで、id ファイルが残っていても「自分のものではない」と判断できる場合には id ファイルを削除した上で mackerel-agent を起動する方法を考えてみました。

を使用して、以下のような script を使います。

#!/bin/bash
export PATH="/usr/local/bin:$PATH"
id_file="/var/lib/mackerel-agent/id"
self_addr=$(ip -4 addr show eth0 | awk '/inet /{ split($2, addr, "/"); print addr[1] }')
if [ -f "$id_file" ]; then
  host_id=$(cat $id_file)
  other_addr=$(mkr hosts | jq -r ".[] | select(.id == \"${host_id}\").ipAddresses.eth0")
  if [ "$self_addr" != "$other_addr" ]; then
    echo "host_id: ${host_id} ip_addr:${other_addr} is already registered on Mackerel server. Removing ${id_file}"
    rm -f "$id_file"
  fi
fi

mkr hosts で Mackerel 側に存在するホストを一覧し、

  • 同じ host id の eth0 の IPアドレスを取得
  • 自分の eth0 の IPアドレスと異なる場合は /var/lib/mackerel-agent/id を削除

という動作をします。
これを mackerel-agent 起動前に実行すれば、idの重複を事前に検知して新ホストとして登録できますね。

……というユーザ側の対処なしで agent が自動で判別できる仕組みがあると一番いいので、どういう設定ができると嬉しいか考えてみました。

  • mackerel-agent.conf に、ホストを一意に識別する key (を取得するためのコマンド) を定義できる
  • Mackerel サーバでは、同一 host id で一意の key が異なる agent が接続してきた場合に新しい id を発行し、agentは以後それをファイルに保存して使用する

「一意に識別するkey」というのは、たとえば AWS なら instance-id などが考えられますが、そこは環境特有の事情があるでしょうから、コマンドで取得できると柔軟かなと。

# mackerel-agent.conf
host_unique_id_command = "curl -s http://169.254.169.254/latest/meta-data/instance-id"

ということができると嬉しいなというエントリを書いてみました。

明日は @tkuchiki さんです!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away