取得所有 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
- 宣告一個 device_list 變數,後續的迴圈會把找到的裝置名稱放到裏面去。
- 使用 with_dict 跟 when 來做篩選,
item.value.host.startswith('SATA')
表示符合 SATA 類型的裝置都要,item.value.removable=='0'
是要篩選掉 CD-ROM 跟 usb storage 這類的裝置。 - 顯示
在篩選出來以後,後續就可以用 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 }}"
- smartctl 可以加上 -j 參數,取得 json 的結果,這樣後續就可以使用 jq 來找指定的資訊,比較快速。
- 顯示:這邊就使用了前篇:小技巧 - 如何在迴圈裡註冊變數 的技巧,避免輸出過多資訊。