使用Ansible lineinfile模块添加行首带星号的配置行
解决Ansible lineinfile处理行首星号的正则异常问题
我明白你碰到的这个坑了——lineinfile模块的regexp参数是按正则表达式解析的,而行首的*是正则里的特殊元字符(用来匹配任意长度的任意字符),直接把{{item}}塞进去的话,Python正则引擎会把它当成正则语法处理,自然就抛出异常了。
解决方案:用regex_escape过滤器转义正则特殊字符
Ansible自带了regex_escape过滤器,能自动把字符串里所有正则特殊字符(包括*、.、+等)转义成普通字符,让正则引擎按字面量匹配。修改后的Playbook代码如下:
- set_fact: log_servers: - "auth.info\t@10.10.10.100" - "*.info\t@log.example.com" - lineinfile: path: /etc/syslog.conf regexp: '^{{ item | regex_escape }}' line: '{{ item }}' loop: "{{ log_servers }}"
为什么这样有效?
- 对于第二行的
*.info\t@log.example.com,经过regex_escape过滤后,会变成\*.info\t@log.example.com,对应的regexp就是^\*.info\t@log.example.com——正则引擎会把\*当作字面量*来匹配,精准定位行首的目标配置行。 line参数依然使用原始的{{item}},所以写入到syslog.conf里的内容不会带多余的反斜杠,完全符合你的需求。
这个方法还能兼容其他包含正则特殊字符的配置行,通用性很强,不用手动逐个转义特殊字符。
内容的提问来源于stack exchange,提问作者mtovey
相关产品推荐
相关产品推荐

