Ansible - 更改确切的 IP 地址

Ansible - 更改确切的 IP 地址

假设 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'

相关内容