Ansible无法移除注释及其中间代码块,求可行解决方案
你的三个任务失败原因分析
- lineinfile模块:这个模块是逐行处理文件的,
regexp参数仅支持匹配单行内容,无法直接识别多行代码块,所以你的多行正则表达式在这里完全不起作用。 - 第一个blockinfile任务:blockinfile只管理它自身插入的标记块(默认标记为
# BEGIN ANSIBLE MANAGED BLOCK和# END ANSIBLE MANAGED BLOCK),你手动添加的# Start-Temp-NS-Flip/# End-Temp-NS-Flip不属于它的管理范围,因此无法匹配到目标块。 - 第二个blockinfile任务:你编写的
block内容第一行缺失#(正确应为# Start-Temp-NS-Flip),且blockinfile不会处理非它插入的手动添加块,所以依然匹配失败。
可行的移除方案:使用replace模块
replace模块支持多行正则匹配,能够直接将目标代码块替换为空,且不会影响文件内其他内容,完美适配你的需求。
示例Ansible任务:
- name: 移除临时DNS配置块 replace: path: /etc/resolv.conf regexp: '^# Start-Temp-NS-Flip\n.*\n.*\n# End-Temp-NS-Flip' replace: '' backup: true
灵活适配说明:
如果担心中间两行nameserver的顺序或内容可能有变动,可以使用更宽松的正则表达式:
regexp: '^# Start-Temp-NS-Flip\n(.+\n)+# End-Temp-NS-Flip'
该正则会匹配起始标记到结束标记之间的任意多行内容,容错性更强。
内容的提问来源于stack exchange,提问作者motorleague
相关产品推荐
相关产品推荐

