MackerelのCPU・Memoryアラート発生時にそれぞれの高負荷なプロセスをSlackに通知するツール ( 改修とAnsibleデプロイ )
以前に以下の記事を作成した。この記事の内容からツールをアップデートした事について書きます。
修正・追加したこと
- mackerelのapi-keyーをsystemで環境変数を参照するように変更
- アラート発生時から3分以内に通知するように実装 ( 同じアラートが長く発生していると毎分通知する事を回避 )
- Ansibleでのツールデプロイ
1. mackerelのapi-keyをsystemで環境変数から参照
os.Getenv
を使って環境変数を取得します。
今回は 環境変数名を MACKEREL_APIKEY
として用意したので以下のコードにしました。
var ( ・・・ mkrKey = os.Getenv("MACKEREL_APIKEY") mkr = mackerel.NewClient(mkrKey) )
- 2.アラート発生時から3分間は毎分実行時に通知する処理を追加
ツールをサーバに展開するときは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
- コンパイルしてzip化したファイルを配置
まとめ
今回の追加とツールデプロイで、mackerelのapi-keyを環境変数化して、その環境変数をsystemdで参照して実行できるようにしました。 また、実際にサーバに作成したツールを展開するためにツール実行の部分だけですがAnsibleのコードに落とし込みました。