取得所有 SATA 的磁碟

最近要使用 smartmontools 套件裡的 smartctl 來查閱硬碟的 S.M.A.R.T. 狀態,做定期檢查,以免來不及去備份跟更換。這邊打算寫 ansible playbook 來作,所以就需要先取得主機上的所有硬碟。 好在 Ansible 本身在收集資訊時,就已經收集了,只是,這裏面還包含有 CD-ROM、Loop 等的裝置,我只想要 SATA 類型的啊~

要做到這件事情,基本上只要搭配 when 跟 loop 就可以取得了。

---
- name: Get all harddisk
  hosts: all

  tasks:
  - set_fact:
      device_list: []

  - name: get device name
    set_fact:
      device_list: "{{ device_list + [ item.key ] }}"
    no_log: True
    with_dict: "{{ ansible_devices }}"
    when: "item.value.host.startswith('SATA') and item.value.removable=='0'"

  - name: show all values for selected device name
    debug:
      var: device_list
  1. 宣告一個 device_list 變數,後續的迴圈會把找到的裝置名稱放到裏面去。
  2. 使用 with_dict 跟 when 來做篩選, item.value.host.startswith('SATA') 表示符合 SATA 類型的裝置都要,item.value.removable=='0' 是要篩選掉 CD-ROM 跟 usb storage 這類的裝置。
  3. 顯示

在篩選出來以後,後續就可以用 smartctl -H 去查閱 S.M.A.R.T. 資訊啦。

  - name: check S.M.A.R.T.
    shell: |
      echo -n "/dev/{{ item }} S.M.A.R.T. status = "
      smartctl -H "/dev/{{ item }}" -j | jq -r ".smart_status.passed"      
    register: shell_result
    loop: "{{ device_list }}"
    become: yes
  - name: Display S.M.A.R.T. status
    debug:
      msg: "{{ item.stdout }}"
    loop: "{{ shell_result.results }}"
    loop_control:
      label: "{{ item.stdout }}"
  1. smartctl 可以加上 -j 參數,取得 json 的結果,這樣後續就可以使用 jq 來找指定的資訊,比較快速。
  2. 顯示:這邊就使用了前篇:小技巧 - 如何在迴圈裡註冊變數 的技巧,避免輸出過多資訊。

參考資料