My Note

自己理解のためのブログ

MackerelのCPU・Memoryアラート発生時にそれぞれの高負荷なプロセスをSlackに通知するツール ( 改修とAnsibleデプロイ )

以前に以下の記事を作成した。この記事の内容からツールをアップデートした事について書きます。

yhidetoshi.hatenablog.com

修正・追加したこと

  1. mackerelのapi-keyーをsystemで環境変数を参照するように変更
  2. アラート発生時から3分以内に通知するように実装 ( 同じアラートが長く発生していると毎分通知する事を回避 )
  3. Ansibleでのツールデプロイ

1. mackerelのapi-keyをsystemで環境変数から参照

今回は 環境変数名を MACKEREL_APIKEY として用意したので以下のコードにしました。

var (
  ・・・
    mkrKey   = os.Getenv("MACKEREL_APIKEY")
    mkr      = mackerel.NewClient(mkrKey)
)

ツールをサーバに展開するときはansibleで行います。

3. Ansibleでツールを設定する

systemdを利用してツールを毎分実行します。systemdで実行する際に環境変数を参照する必要があるので.service 環境変数を定義したファイルを参照するように定義しました。

EnvironmentFile=/etc/default/mackerel-alert-tool
  • /etc/default/mackerel-alert-tool

→ Goで環境変数を取得するmackerelのapi-keyの環境変数を定義しました。

※) OS: Ubuntu16

tasks

  • tasks/main.yml
- name: Copy mackerel alert-tool zip
  copy:
    src: mackerelAlertProcList.zip
    dest: /tmp
    mode: 0755
    owner: ubuntu
    group: ubuntu


- name: Unarchive mackerel alert-tool zip
  unarchive:
    src: /tmp/mackerelAlertProcList.zip
    dest: /usr/local/bin
    remote_src: yes


- name: Copy mackerel alert-tool service
  template:
    src: mackerel_alert.service.j2
    dest: /etc/systemd/system/mackerel_alert.service
  become: yes


- name: Copy mackerel alert-tool timer
  template:
    src: mackerel_alert.timer.j2
    dest: /etc/systemd/system/mackerel_alert.timer
  become: yes


- name: Copy mackerel alert-tool env file
  template:
    src: mackerel-alert-tool.j2
    dest: /etc/default/mackerel-alert-tool
  become: yes


- name: Ensure start mackerel alert-tool timer
  systemd:
    state: started
    daemon_reload: yes
    enabled: yes
    name: mackerel_alert.timer
  become: yes

templates

  • templates/mackerel_alert.service.j2
[Unit]
Description=mackerel alert to slack if exist alert
After=network.target

[Service]
ExecStart=/usr/local/bin/mackerelAlertProcList -slackurl={{ mackerel_alert_slack_url }}
Type=oneshot
EnvironmentFile=/etc/default/mackerel-alert-tool

[Install]
WantedBy=multi-user.target
  • templates/mackerel-alert-tool.j2
MACKEREL_APIKEY="{{ mackerel_agent_apikey }}"
  • templates/mackerel_alert.timer.j2
[Unit]
Description=Check mackerel alert every 1 minutes.

[Timer]
OnUnitActiveSec=1min

[Install]
WantedBy=timers.target

vars

  • vars/main.yml
---
mackerel_alert_slack_url: <mackerel_alert_slack_url>
mackerel_agent_apikey: <mackerel_agent_apikey>

files

  • files/mackerelAlertProcList.zip

まとめ

今回の追加とツールデプロイで、mackerelのapi-keyを環境変数化して、その環境変数をsystemdで参照して実行できるようにしました。 また、実際にサーバに作成したツールを展開するためにツール実行の部分だけですがAnsibleのコードに落とし込みました。