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

Ansible生成Kickstart文件时logvol的grow属性报错排查

问题描述

我用Ansible生成Kickstart文件时,给逻辑卷添加--grow参数导致Playbook执行失败。分区(PV)的J2模板里{{ ' --grow' if part.grow else '' }}能正常工作,但逻辑卷(LV)模板里用{{ ' --grow' if vol.grow else '' }}时,报错AnsibleUndefinedVariable: 'dict object' has no attribute 'grow'。Verbose输出显示部分logvol对象定义了grow属性,删掉该语句后文件能正常生成。

相关变量与模板代码如下:

变量定义

partitions:
  - { name: /boot, fstype: ext2, primary: true, grow: false, size_mib: "{{ 2*1024 | int }}", drive: sda }
  - { name: pv.01, drive: sda, fstype: lvmpv, primary: true, size_mib: 1, grow: true }

volgroups:
  - { name: main, device: pv.01 }

logvols:
  - { mount: swap, fstype: swap, volgroup: main, size_mib: "{{ 4*1024 | int }}" }
  - { mount: /, volgroup: main, size_mib: 1, grow: true, fstype: xfs }

分区(PV)模板代码

{% for part in item.partitions|default([]) %}
part {{ part.name }} --size {{ part.size_mib }}{{ ' --asprimary' if part.primary else '' }}{{ ' --grow' if part.grow else '' }}{% if part.fstype is defined %} --fstype={{ part.fstype }}{% endif %} --ondrive={{ part.drive }}
{% endfor %}
{% endif %}

逻辑卷(LV)模板代码

{% for vol in item.logvols|default([]) %}
logvol {{ vol.mount }} --name={% if vol.mount != '/' %}lv_{{ vol.mount | regex_replace('^/', '') | replace('-','__') | replace(' ','___') | replace('/','_') }}{% else %}lv_root{% endif %} --vgname=vg_{{ item.hostname | replace('-','_') }}_{{ vol.volgroup }} --fstype={{ vol.fstype | default('xfs') }} --size={{ vol.size_mib }}{{ ' --grow' if vol.grow else '' }}
{% endfor %}
问题原因

分区变量partitions里的每个条目都明确定义了grow属性(不管是true还是false),但logvols里的swap逻辑卷没有定义grow键。Ansible在Jinja2模板中直接访问vol.grow时,若字典不存在该键就会抛出未定义变量错误,而分区模板因为每个part都有grow所以没问题。

解决方案

有两种简单的修复方式:

方式1:修改模板,用default()处理未定义属性

把逻辑卷模板中的{{ ' --grow' if vol.grow else '' }}替换成:

{{ ' --grow' if vol.grow | default(false) else '' }}

default(false)会在vol.grow未定义时自动返回false,既不会触发错误,还能保留已定义grow: true的逻辑卷的--grow参数。

方式2:补全变量定义,给所有logvol加grow属性

在logvols的每个条目里都明确加上grow: false(不需要grow的条目),比如:

logvols:
  - { mount: swap, fstype: swap, volgroup: main, size_mib: "{{ 4*1024 | int }}", grow: false }
  - { mount: /, volgroup: main, size_mib: 1, grow: true, fstype: xfs }

这样所有logvol对象都有grow属性,原模板代码就能正常工作。

验证效果

修改后重新执行Playbook,Kickstart文件会正确生成:

  • swap逻辑卷不会添加--grow参数
  • /逻辑卷会带上--grow参数

内容的提问来源于stack exchange,提问作者Jeight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:10:25