Ansible脚本检查磁盘可用空间时变量未定义的问题咨询
问题分析与解决方案
你遇到的问题核心在于**ansible_mounts是一个列表(数组)类型的变量**,而不是单个字典对象,所以直接通过disk_free.ansible_facts.ansible_mounts.size_available访问会报错——列表本身没有size_available这个属性,这个属性属于列表里的每一个挂载点字典。
先确认挂载点数据结构
你可以先打印出完整的ansible_mounts内容,看看它的实际结构:
- name: Test for available disk space setup: filter=ansible_mounts register: disk_free - debug: var=disk_free.ansible_facts.ansible_mounts
输出会是类似这样的结构(每个元素对应一个系统挂载点):
ok: [target_host] => { "disk_free.ansible_facts.ansible_mounts": [ { "mount": "/", "size_available": 123456789, # 其他挂载相关字段... }, { "mount": "/home", "size_available": 987654321, # 其他挂载相关字段... } ] }
解决方案1:遍历所有挂载点,打印每个的可用空间
如果你想查看所有挂载点的可用空间,可以用loop遍历列表,逐个访问每个挂载点的size_available:
- name: Print available space for all mounts debug: msg: "Mount point {{ item.mount }} has {{ item.size_available | human_readable }} free space" loop: "{{ disk_free.ansible_facts.ansible_mounts }}"
这里用human_readable过滤器把原始字节数转换成易读的单位(比如MB/GB),让输出更直观。
解决方案2:过滤特定挂载点(比如根目录/)
如果你只关心某个特定挂载点(比如系统根目录/),可以用selectattr过滤列表,再取第一个匹配的元素:
- name: Get available space for root filesystem set_fact: root_disk_free: "{{ disk_free.ansible_facts.ansible_mounts | selectattr('mount', 'equalto', '/') | first | json_query('size_available') }}" - debug: msg: "Root filesystem has {{ root_disk_free | human_readable }} free space"
如果担心目标主机没有匹配的挂载点(极端场景),可以加上default()处理异常:
root_disk_free: "{{ (disk_free.ansible_facts.ansible_mounts | selectattr('mount', 'equalto', '/') | first | default({})) | json_query('size_available') | default('N/A') }}"
为什么你的原代码会报错?
你试图直接访问列表的size_available属性,但列表本身没有这个属性——只有列表里的每个挂载点字典才有。这就像你不能直接问一个“水果篮子”的“颜色”,得先拿出篮子里的某个水果,再问它的颜色一样。
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

