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 さんです!