Ansible lvol模块用100%FREE创逻辑卷重跑报错求助
解决Ansible lvol模块使用
100%FREE重跑失败的问题 我之前也碰到过一模一样的情况!其实这算不上是模块的bug,而是lvol模块的默认行为导致的:当你指定size: "100%FREE"时,Ansible会在每次运行时尝试将目标逻辑卷(LV)调整到卷组(VG)的剩余空间大小。第一次运行时剩余空间充足,创建LV没问题;但重跑时,VG已经没有剩余空间了,模块就会试图把已存在的LV缩小到0,这自然会触发错误。
而用30g这类绝对大小不会出问题,是因为重跑时LV已经是30g,模块检测到大小匹配,就不会执行调整操作。
最简单的解决方案:禁用已存在LV的大小调整
只需要给第二个lvol任务加上resize: false参数即可。这个参数会告诉Ansible:如果LV已经存在,就不要尝试调整它的大小,直接跳过操作。修改后的任务如下:
- name: Create a logical volume for docker directory. lvol: vg: agent_vg lv: docker_vol size: "100%FREE" resize: false
第一次运行时,LV不存在,模块会正常创建并占用所有剩余空间;后续重跑时,LV已经存在,resize: false会让任务直接标记为"ok",不会再尝试调整大小,也就不会报错了。
另一种思路:仅在LV不存在时创建
如果你更倾向于严格的"只创建一次"逻辑,可以通过when条件判断LV是否存在,再决定是否执行任务。比如先通过command模块检查LV状态:
- name: Check if docker_vol exists command: lvdisplay agent_vg/docker_vol register: lv_exists failed_when: false changed_when: false - name: Create a logical volume for docker directory. lvol: vg: agent_vg lv: docker_vol size: "100%FREE" when: lv_exists.rc != 0
这种方法的好处是完全避免了对已存在LV的任何操作,缺点是多了一个前置检查任务。
为什么不推荐用ignore_errors?
虽然ignore_errors: true能掩盖错误,但这会忽略掉真正的异常情况(比如VG确实有剩余空间但创建失败的情况),所以不建议这么做。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

