能否使用Ansible的lineinfile模块基于正则匹配添加配置块?
嘿,我来帮你梳理下这个问题~你的需求是给文本里每个interface gigabitX/X/X行后面添加shutdown和!,先说说你现有Playbook的几个问题:
- 没必要用
with_lines: cat ha.txt:lineinfile模块本身就会处理整个文件,循环每一行执行会导致重复操作,甚至可能多次添加配置块,完全是画蛇添足。 - 正则表达式有问题:你写的
interface?\s[a-z]\w*/[0-9]/[0-9]里,interface?表示最后一个e是可选的,会匹配interfac这种错误写法;而且[a-z]\w*匹配gigabit不够精准,容易误匹配其他开头的接口名。
接下来给你两个靠谱的实现方案,优先推荐第一个:
方案1:用replace模块(推荐,避免重复执行重复添加)
replace模块可以通过正则替换一次性处理所有匹配行,而且执行多次也不会重复添加内容,因为替换后的行不再匹配原正则:
--- - hosts: localhost tasks: - name: 给每个interface添加shutdown配置块 replace: path: ./ha.txt regexp: '^(interface\s+gigabit\d/\d/\d)$' replace: '\1\n shutdown\n !' backup: yes # 可选参数,自动备份原文件,防止误操作
解释:
regexp: '^(interface\s+gigabit\d/\d/\d)$':精准匹配以interface gigabit开头、格式为X/X/X的接口行replace: '\1\n shutdown\n !':\1引用匹配到的整行接口内容,然后拼接上shutdown和!,实现批量替换
方案2:用lineinfile模块(注意重复执行的问题)
如果你坚持要用lineinfile,需要去掉循环,修正正则,但要注意:多次执行Playbook会重复添加配置块(因为每次都会在匹配行后插入内容):
--- - hosts: localhost tasks: - name: 在每个interface后插入shutdown配置 lineinfile: path: ./ha.txt regexp: '^interface\s+gigabit\d/\d/\d$' insertafter: '^interface\s+gigabit\d/\d/\d$' line: | shutdown ! state: present
这个方案适合只执行一次的场景,或者你能确保不会重复运行Playbook。
内容的提问来源于stack exchange,提问作者Nalore
相关产品推荐
相关产品推荐

