如何让Ansible lineinfile仅匹配正则且未加grep时追加内容
Ansible lineinfile 精准修改iptables脚本的解决方案
原配置存在两个问题:重复追加grep命令、无匹配行时会将内容追加到文件末尾。以下是修正后的Playbook及说明:
修正后的代码
--- - name: skip fail2ban in iptables checkmk plugin hosts: localhost gather_facts: no tasks: - name: modify plugin only if grep not present ansible.builtin.lineinfile: path: /usr/lib/check_mk_agent/plugins/mk_iptables backrefs: True regexp: '^(iptables-save(?!.*grep -v "f2b").*)$' line: '\1 | grep -v "f2b"'
关键修改点
- 正则表达式优化:使用负向预查
(?!.*grep -v "f2b"),仅匹配以iptables-save开头且未包含目标grep命令的行,彻底避免重复修改 - 无匹配时不追加:由于正则仅锁定需要修改的行,当文件中没有符合条件的行时,
lineinfile模块不会执行任何追加操作(默认state: present仅对匹配行生效) - 保留原有内容:
backrefs: True确保仅在匹配行的原有内容后追加grep命令,不会替换整行内容
常见问题说明
你之前尝试的(?[grep])是错误的正则语法,负向预查的正确格式为(?!...),用于排除已经包含特定内容的行。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

