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

