Ansible正则表达式匹配Netplan配置DNS地址失败求助
解决Ansible lineinfile匹配DNS配置行的问题
你的正则匹配失败主要踩了这几个坑:
- 正则里的
[是特殊元字符,用来定义字符组,直接写会失效,必须转义成\[,结尾的]同理也要转义成\] - 原正则只匹配了单数字段的IP(比如
8.8.8.8),完全没考虑一行里有多个IP的情况 - 硬写固定空格数不够灵活,yaml缩进稍有变化就会匹配失败
给你两个可行的解决办法:
方案1:灵活适配当前格式
用转义后的方括号,同时支持匹配多个IP,还能兼容任意缩进:
- name: 更新DNS服务器地址 lineinfile: path: /etc/netplan/netcfg.yaml regexp: '^\s+addresses: \[[0-9.]+(,[0-9.]+)*\]$' line: ' addresses: [1.1.1.1,1.0.0.1]' backrefs: yes
解释:
^\s+:匹配行首任意数量的空格,不用硬写固定个数\[[0-9.]+(,[0-9.]+)*\]:匹配[IP,IP...]的格式,覆盖单个或多个IP的场景
方案2:严格匹配合法IP格式
如果需要精准校验IP合法性,可以用更严谨的正则(日常场景方案1足够):
- name: 更新DNS服务器地址 lineinfile: path: /etc/netplan/netcfg.yaml regexp: '^\s+addresses: \[((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(,((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*\]$' line: ' addresses: [1.1.1.1,1.0.0.1]' backrefs: yes
注意:要把path改成你实际的文件路径,line里的缩进必须和原文件保持一致,否则会破坏yaml的格式有效性。
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

