Regex Ansible通过逐行循环文件,使用正则表达式替换ip地址

Regex Ansible通过逐行循环文件,使用正则表达式替换ip地址,regex,ansible,Regex,Ansible,我不熟悉ansible 我有一个包含多行的文件,其中某些行引用了ipv4地址。我的用例是用同一ip的增量版本替换这些行中的每个ip地址 例如,如果我的文件有以下行: 行中的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 replace模块在使用regex和replace的行中查找ipv4地址 -

我不熟悉ansible

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

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

行中的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 replace模块在使用regex和replace的行中查找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地址替换为我在替换中指定的ip地址

是否有办法从每一行提取ip地址并将其递增,并使用任何模块(如lineinfle或replace)替换IPADR以代替旧ip

我正在运行ansible 2.6

尝试使用此正则表达式:

^(\d{1,3}\.){3}\d{1,3}
^
表示字符串的开头。

尝试使用此正则表达式:

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

^
表示字符串的开始。

您可以从ansible playbook调用python脚本来执行您感兴趣的任务。如果你想做ip地址算法,这个函数很有用

例如:

---
  - 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)

您可以从ansible playbook调用python脚本来执行感兴趣的任务。如果你想做ip地址算法,这个函数很有用

例如:

---
  - 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)

只是正则表达式不是问题所在。我想弄清楚如何使用正则表达式逐行循环通过一个文件提取ip,然后用一个增量版本的IT替换它只是正则表达式不是问题所在。我想弄清楚如何使用正则表达式逐行循环通过一个文件提取ip,然后用一个递增的版本替换它。如果您试图递增正则表达式中捕获的整数。单独使用正则表达式是不可能的。您可以在ansible中通过一系列任务来实现这一点,但这将非常冗长,对于下一个开发人员来说可能很难理解,而且维护起来非常困难。我建议您只需编写一个脚本并从ansible复制/执行它。如果您仍然想要一个完整的ansible解决方案,请编写一个自定义和/或。您正在尝试递增正则表达式中捕获的整数。单独使用正则表达式是不可能的。您可以在ansible中通过一系列任务来实现这一点,但这将非常冗长,对于下一个开发人员来说可能很难理解,而且维护起来非常困难。我建议您只需编写一个脚本并从ansible复制/执行它。如果仍然需要完整的ansible解决方案,请编写自定义和/或。