假设 shorewall 规则配置包含
ACCEPT net:1.234.5.253 all tcp 3306
ACCEPT net:1.234.5.2 all tcp 80
ACCEPT net:1.234.5.2 all tcp 80
ACCEPT net:1.2.3.4,1.234.5.22,1.1.1.1 all tcp 3306
我想用 ansible 替换它们
- name: Replace old ips in /etc/shorewall/rules
replace:
path: /etc/shorewall/rules
regexp: '{{ oldip }}'
replace: '{{ newip }}'
backup: 'yes'
变量是
vars:
oldip: 1.234.5.2
newip: 100.100.100.100
我得到的输出是正确的,但我期望替换 ip 的精确匹配而不是此输出
ACCEPT net:100.100.100.10053 all tcp 3306
ACCEPT net:100.100.100.100 all tcp 80
ACCEPT net:100.100.100.100 all tcp 80
ACCEPT net:1.2.3.4,100.100.100.1002,1.1.1.1 all tcp 3306
有什么办法可以解决吗?
答案1
在您提供的示例中,您可以使用锚点:
- name: Replace old ips in /etc/shorewall/rules
replace:
path: /etc/shorewall/rules
regexp: '(\D){{ oldip }}(\D)'
replace: '\1{{ newip }}\2'
backup: 'yes'
搜索一个非数字,然后是旧 IP,然后是另一个非数字。
替换为找到的第一个非数字,后跟新 IP 和第二个捕获组。
如果存在反向引用被误解的风险(例如,如果您的新 IP 是硬编码而不是在变量中),请使用\g
来避免\1
和之间的混淆\1100
:
replace: '\g<1>100.100.100.100\2'