Replace

Ansible - 更改確切的 IP 地址

  • July 15, 2020

假設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

有什麼辦法可以解決嗎?

在您提供的範例中,您可以使用錨點:

- 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以避免混淆\1and \1100

   replace: '\g<1>100.100.100.100\2'

引用自:https://unix.stackexchange.com/questions/598661