You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:17:47