Ansible:lineinfile模块返回值.changed与.found的差异及疑问
关于Ansible lineinfile模块
.found与.changed的核心区别及场景表现 一、核心定义差异
.found:lineinfile模块专属返回值,仅用来标记目标行是否在文件中被匹配到,和模块的state参数完全无关——不管你是要删行、改行还是加行,只要模块找到了符合regexp(或line)规则的行,.found就返回True,反之则为False。.changed:Ansible全模块通用返回值,标记模块是否对系统状态做了实际修改(或在check_mode下计划修改),完全依赖state参数的操作意图:- 当
state: absent时,若找到目标行,模块会(或计划)删除它,.changed为True;没找到目标行则无需操作,.changed为False。 - 当
state: present时,若目标行不存在/内容不符合要求,模块会(或计划)添加/修改它,.changed为True;目标行已完全符合要求则.changed为False。
- 当
二、你遇到的场景现象解析
1. state: absent + check_mode: yes下两者表现一致的原因
当你设置state: absent时,模块的核心意图是删除匹配到的行:
- 如果
PermitRootLogin行存在(不合规),.found=True,同时check_mode下模块会标记“将要执行删除操作”,所以.changed=True。 - 如果
PermitRootLogin行不存在(合规),.found=False,模块无需任何操作,.changed=False。
这种场景下两者的返回值完全同步,所以看起来效果一样。
2. .found无法配合state: present使用的原因
.found只关心“有没有找到目标行”,但state: present的意图是确保目标行存在且内容完全符合要求,这里会出现三种情况:
- 情况1:目标行存在且内容完全匹配——
.found=True,.changed=False(无需修改)。 - 情况2:目标行存在但内容不符合(比如实际是
PermitRootLogin yes而你要求设为no)——.found=True,但.changed=True(模块会修改该行)。 - 情况3:目标行不存在——
.found=False,.changed=True(模块会添加该行)。
显然,.found无法区分“行存在但违规”和“行存在且合规”的情况,用它判断state: present场景的合规性完全不准确,自然不存在“配合使用”的价值。
三、使用建议
- 做合规检查时,如果是验证某配置行必须不存在(比如CIS要求禁用
PermitRootLogin),用state: absent+check_mode: yes时,.changed或.found都能工作,但.changed更贴合Ansible的“状态变更”逻辑,它直接反映了“当前状态是否需要修正才能符合合规要求”。 - 如果是验证某配置行必须存在且值正确(比如要求
PermitRootLogin no),必须用.changed判断——因为.found识别不了“行存在但值错误”的违规场景。
内容的提问来源于stack exchange,提问作者user10160459
相关产品推荐
相关产品推荐

