GitLab-CIでMackerelの設定の定期差分確認

こんにちは

インフラの戸田です。

もうすぐ春ですね。戸田は、この冬、稀に見る補強により、球春の幕開けが楽しみで楽しみで仕方がありませんでした。
しかし、主力が肉離れを起こし、超期待されていた選手が右有鈎骨骨折していたという事実を知りませんでした。(何の話かというと、プロ野球のとあるチームの話です。

みなさんも有鈎骨骨折には気をつけてください

では、本題にいきます。

やること

弊社では一部サービスにおいて、監視サービスのMackerelを利用し監視を行っております。

今回の記事では、GitLabで mkr pull でダウンロードする設定ファイルを管理しているプロジェクトについてのお話となります。

この運用をしていた場合、Mackerelの監視設定変更をGUIで行った場合に、GtiLabで管理されている設定ファイルと実際の設定に差分が生じます。

例として、
特定のタイミングで、一旦ミュートにし、戻し忘れ、何かあっても通知が来ない。のような場合があるかもしれません。

そんなことがないように、Mackerel上の設定に差分がないか定期的に確認します。

使うもの

  • MackerelのAPIキーとmonitors.json
  • Dockerfile とdocker-compose.ymlとシェル
  • gitlab-ci.yml

以上になります。

設定順番

  • MackerelのAPIキーを取得する
  • Dockerを使って、monitors.jsonを取得する
  • GitLab Container RegistryにDockerイメージをpushする
  • GitLabに.gitlab-ci.ymlをpush
  • スケジューラーの設定

MackerelのAPIキー取得

管理画面のトップからAPIキーを新しく取得して、記録しておきます。

Dockerを使って、monitor.jsonを取得する

Dockerfile

FROM amazonlinux:1

RUN yum install -y sudo
RUN curl -fsSL https://mackerel.io/file/script/amznlinux/setup-yum.sh | sh
RUN yum install -y mkr
RUN mkdir /data
WORKDIR /data

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

docker-compose.yml

version: "3"
services:
  mkr:
    build: ./
    volumes:
      - ./monitors.json:/data/monitors.json
    environment:
      - MACKEREL_APIKEY

docker-entrypoint.sh

#!/bin/bash
set -e

if [ "$1" = 'pull' ]; then
  mkr monitors pull
fi

if [ "$1" = 'push' ]; then
  { mkr monitors diff -e || (read -p '差分がありますが上書きしても良いですか? (y/N): ' yn; case \"$$yn\" in [yY]*) ;; *) exit 1 ; exit 0 ;; esac) } && mkr monitors push && mkr monitors pull && echo completed
fi

if [ "$1" = 'check' ]; then
  mkr monitors diff -e
fi

これらを使って、monitors.jsonを取得します。

ローカルでの実行方法は

MACKEREL_APIKEY="MackerelのAPIキー" docker-compose run --rm mkr [pull|push|check]

で実行します。

GitLab Container RegistryにDockerイメージをpushする

GitLabにはDockerイメージを保管できる機能があるので、そこにDockerイメージを追加します。

Registryタブに移動すると、How to use the Container Registry に実行方法が記載されてますので、今回は省略します。

GitLabに.gitlab-ci.ymlをpushする

.gitlab-ci.yml

---
stages:
  - check

mkr-setting-check:
  stage: check
  image: 
    name: "先ほどGitLabにpushしたDockerのimage名"
    entrypoint: [""]
  script:
    - ./docker-entrypoint.sh check
  only:
    - schedules

GitLab-CIで使う用のYAMLです。あとは、スケジューラーに登録します。

スケジューラーの設定

f:id:AdwaysEngineerBlog:20190308165601p:plain

「毎日午前11時にmasterブランチに対して、実行してね」という設定のみで大丈夫です。(上記の画像の通りです)

あとは、「Settings」-> 「Integrations Settings」-> 「Slack notifications」にwebhook URLを記入します。

「Notify only broken pipelines」にチェックを入れるだけで、差分があったときのみ通知してくれます。

感想

内容はすごくシンプルです。Docker初心者が教えてもらいながら、初めてこのようなものを作りました。

実際に「設定をミュートにしていたことがわかった」というお声を頂いたので、 すごくうれしかったです。

まとめ

GitLabを使って、簡単にMackerelの設定を管理して、定期的な差分確認をできるというのは幸せですね。

以上となります。 最後までご覧いただきありがとうございます。