![如何使用 ansible 事实收集选择性 dsk 和未使用的空间?](https://linux22.com/image/1628339/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20ansible%20%E4%BA%8B%E5%AE%9E%E6%94%B6%E9%9B%86%E9%80%89%E6%8B%A9%E6%80%A7%20dsk%20%E5%92%8C%E6%9C%AA%E4%BD%BF%E7%94%A8%E7%9A%84%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
这是我的示例代码,问题在底部
hw.j2
:
System Total Memory : {{ ansible_memtotal_mb }}
Free Memory : {{ ansible_memfree_mb }}
System Total CPU : {{ ansible_processor_cores }}
System Virtual CPU : {{ ansible_processor_vcpus }}
Disks capacities
/dev/sda : {{ ansible_devices.sda.size }}
/dev/sdb : {{ ansible_devices.sdb.size }}
/dev/sdc : {{ ansible_devices.sdc.size }}
collecthw.yml
:
---
- name: Collect information
become: yes
hosts: clients
tasks:
- name: use template from labs/hw.j2
template:
src: hw.j2
dest: hw.{{ ansible_facts.hostname }}.txt
owner: corona
group: corona
mode: '0600'
它可以正常工作但是......
现在我的问题是:
- 如何循环遍历管理节点中的所有 /dev/sd* 并收集它们各自的磁盘大小?
- 这是磁盘大小,磁盘中未使用的磁盘空间怎么办?
提前感谢那些愿意花时间和精力来获取答案或其他建议的人。我是新手 xD
答案1
例如,选择除loop*
显示尺寸之外的所有设备
- set_fact:
my_devices: "{{ ansible_devices.keys()|
reject('match', '^loop(.*)$')|
list }}"
- debug:
msg: "{{ item }} {{ ansible_devices[item].size }}"
loop: "{{ my_devices }}"
给
msg: nvme0n1 238.47 GB
问题 1:“如何循环遍历管理节点中的所有 /dev/sd* 并收集它们各自的磁盘大小?”
A1:在上面的代码中,更改reject
过滤至select
select('match', '^sd(.*)$')|
并使用下面的模板
{% for dev in my_devices %}
{{ dev }}: {{ ansible_devices[dev].size }}
{% endfor %}
问题2:“磁盘中未使用的磁盘空间怎么办?”
A2:使用变量ansible_mounts
显示未使用的空间。例如
- set_fact:
my_devs: "{{ my_devs|default([]) +
[ansible_mounts|
selectattr('device', 'match', my_regex)|
list|
json_query(my_query)]|first }}"
loop: "{{ my_devices }}"
vars:
my_regex: '^(.*){{ item }}(.*)$'
my_query: '[].[device, size_total, size_available]'
- debug:
msg: "dev: {{ item.0 }}
size[MB]: {{ (item.1|int / 1000000)|int }}
free[MB]: {{ (item.2|int / 1000000)|int }}"
loop: "{{ my_devs }}"
给
msg: 'dev: /dev/nvme0n1p6 size[MB]: 41015 free[MB]: 12677'
msg: 'dev: /dev/nvme0n1p7 size[MB]: 109899 free[MB]: 39896'
msg: 'dev: /dev/nvme0n1p2 size[MB]: 100 free[MB]: 45'
使用下面的模板以字节为单位存储未使用的空间
{% for dev in my_devs %}
{{ dev[0] }}: {{ dev[2] }}
{% endfor %}
答案2
好的,gys,我终于找到了答案。它的默认值与 jinja 模板有关。
以下示例代码:
vi hw.j2
磁盘容量
/dev/sda:{{ ansible_devices.sda.size|default("NONE", true) }}
/dev/sdb:{{ ansible_devices.sdb.size|default("NONE", true) }
} /
dev/sdc:{{ ansible_devices.sdc.size|default("NONE", true) }} /dev/sdz:{{ ansible_devices.sdz.size|default("NONE", true) }
client@ cat list-hw.r8s2.txt
磁盘容量
/dev/sda:20.00 GB
/dev/sdb:20.00 GB
/dev/sdc:20.00 GB
/dev/sdz:NONE