iMind Developers Blog

iMind開発者ブログ

Ansibleでディスク容量チェック

概要

複数台のディスクスペースをチェックしてエラーを投げる処理を書きたかった。

サーバー側には何も入れたくなかったのでAnsibleで実行してみる。

バージョン情報

  • ansible 2.7.6

やり方

StackOverflowによるとansible_mountの結果からsize_availableやsize_totalを取ってassertにかければ良いらしい。

https://stackoverflow.com/questions/44077630/ansible-to-check-diskspace-for-mounts-mentioned-as-variable

playbook

- hosts: foo
  tasks:

  - name: "{{ mountname }} ディスク使用率チェック : 閾値 {{ disk_usage }}"
    assert:
      that: mount.size_available < mount.size_total|float * {{ disk_usage }}
      msg: disk space has reached {{ disk_usage }} threshold
    vars:
      mount: "{{ ansible_mounts | selectattr('mount','equalto',mountname) | list | first }}"

実行コマンド( /home が70%超えたらエラー)

$ ansible-playbook disk_usage.yml \
    --extra-vars "mountname=/home" \
    --extra-vars "disk_usage=0.7"

ansible_mounts

ansible_mountsで取得できる値について確認する。

- hosts: foo
  tasks:
  - debug: var=item
    loop: "{{ ansible_mounts }}"
    "item": {
        "block_available": 10596528, 
        "block_size": 4096, 
        "block_total": 16215174, 
        "block_used": 5618646, 
        "device": "/dev/sda1", 
        "fstype": "ext4", 
        "inode_available": 7988632, 
        "inode_total": 8257536, 
        "inode_used": 268904, 
        "mount": "/home", 
        "options": "rw,relatime,discard,data=ordered", 
        "size_available": 43403378688, 
        "size_total": 66417352704, 
        "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }

ここからsize_availableとsize_totalを取ってみる。

  - debug: msg="{{ item.size_available }} / {{ item.size_total }}"
    loop: "{{ ansible_mounts }}"
"msg": "22673215488 / 66417352704"

改定履歴

Author: Masato Watanabe, Date: 2019-2-20, 記事投稿