背景
個人で使用しているサーバでGrowiやMattermostを使用しており、最近使用頻度が上がったためかディスク使用率が99%となり使用できなくなったことがありました。
その時は結局ディスク拡張することで無事使用できるようになったのでよかったのですが、いつかやるか思っていたディスク監視をいい加減実施するかと重い腰を上げることになりました。
残念ながらまだZabbixなどの監視サーバは用意していないため、我が家のCronマシンAWXくんに定期的に監視してもらうようにansible-playbookを作成して、日次の監視/通知をすることに。
要件
- 監視対象はよく使用するLinux系のサーバのみ
- 通知先は個人で使用しているMattermost
- 日次でサーバディスク使用率を確認し、使用率80%以上だったらMattermostに通知する
ansible-playbook
- hosts: all
gather_facts: true
tasks:
- name: check disk usage
shell: df "{{ item }}" | tail -n +2 | awk '{print $5}' | sed 's/%//'
with_items: "{{ mounts }}"
register: result
- name: debug
debug:
msg="{{ inventory_hostname }} '{{ item.item }}' disk usage is {{ item.stdout }}%"
with_items: "{{ result.results }}"
loop_control:
label: "{{ item.cmd | default(item) }}"
- name: Mattermost Notification
mattermost:
url: "<MattermostURL>"
api_key: "<APIキー>"
text: "{{ inventory_hostname }} '{{ item.item }}' disk usage is over 80%.( {{item.stdout}}% )"
channel: "<通知先のチャンネル名>"
username: "<Mattermostに投稿するのユーザ名>"
icon_url: <表示したいユーザアイコンのURL>
with_items: "{{ result.results }}"
when: 80 <= item.stdout|int
ざっくり説明
- ディスク使用率取得について
- ディスク使用率の取得はdfコマンドの使用率(Use%の項目)を使用するためshellモジュール使用
- dfの結果をawkとsedで使用率の数値のみを取得
-
tail -n +2
はヘッダー情報を削除するため -
with_items
で複数のマウントポイントを監視対象とする- サーバー毎に変数
mounts
でマウントポイントを指定する(以下の感じ)
- サーバー毎に変数
mounts:
- "/"
- "/run"
- debugについて
- 自分がAWX上でぱっと見で分かるようにしたいため設定しているだけでなくてもいい
- Mattermost通知について
- dfコマンドの結果で80%以上だったらMattermostモジュールを実行する
- どのホストか分かるように
inventory_hostname
を忘れずに。そのためgather_facts: true
必須(だと思ってる) - APIキーはMattermostの内向きウェブフックの
<MattermostURL>/hooks/
の後ろの文字列
終わりに
まだディスク拡張したばかり(しかもタイポで想定以上に拡張してしまった)のため、普段の運用で通知されてないです。AWSのディスク使用料がコーヒー数杯分上がってしまった程度の痛み。
まぁこういうのは忘れたころにやってくるのが常なので気長に待ちます。
ちなみに通知テストとして一時的に使用率が20%以上で通知するようにした時の例ですが、以下のような通知が来るようにしてます。