使用正则表达式通过逐行循环访问文件来替换IP地址

时间:2019-05-12 06:43:45

标签: regex ansible

我是新来的ansible。

我有一个包含多行的文件,其中某些行引用了ipv4地址。我的用例是用相同ip的增量版本替换每行中的ipaddress。

例如,如果我的文件包含以下行:

该行的IP地址为10.1.1.1,用户名为test1

该行的IP地址为20.2.2.2,用户名为test2

我想将其替换为:

该行的IP地址为10.1.1.2,用户名为test1

该行的IP地址为20.2.2.3,用户名为test2

我正在使用Ansible替换模块,使用正则表达式和替换在行中查找ipv4地址。

- name: Increment and Replace Ip address and
      replace:
        path: "config/changed-ip.txt"
        regexp: "{{ '([0-9]{1,3}[\\.]){3}[0-9]{1,3}' }}"
        replace: "{{ 'x.x.x.x' }}"

上面的代码将所有ip地址替换为我在replace中指定的IP地址

是否可以使用lineinfile或replace这样的模块从每行提取IP地址并将其递增,并替换ipaddr代替旧IP?

我正在运行ansible 2.6

2 个答案:

答案 0 :(得分:1)

您可以从ansible剧本中调用python脚本来执行您感兴趣的任务。如果您要进行ip地址算术,则ipaddress module很有用。

例如:

---
  - hosts: all
    tasks:
    - command: "python3 process_ip_addresses.py text"

随附的python是:

from ipaddress import IPv4Address
import re
import sys

file_path = sys.argv[1]
with open(file_path) as f:
    text = f.read()

ip_addresses = re.findall( r'[0-9]+(?:\.[0-9]+){3}', text )
replacement_ip_addresses = [str(IPv4Address(address) + 1) for address in ip_addresses]
for old_address, new_addresss in zip(ip_addresses, replacement_ip_addresses):
    text = text.replace(old_address, new_addresss)

with open(file_path, "w") as f:
    f.write(text)

答案 1 :(得分:0)

尝试使用此正则表达式:

^(\d{1,3}\.){3}\d{1,3}

^表示字符串的开头。