Regex Ansible:从IP地址中提取前三个八位字节

Regex Ansible:从IP地址中提取前三个八位字节,regex,ansible,jinja2,Regex,Ansible,Jinja2,我有一个IP地址字符串:192.168.10.2 我想提取Ansible中IP的前三个八位组,并尝试使用这个正则表达式 {{comp_ip | regex_replace("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"), "//1"}} 这不会产生任何结果。有人能纠正我哪里出错了吗?你做得对,你只需要在正则表达式中使用括号就可以组成一个组。最好匹配整个ip,并以$结束正则表达式,同时在代码中将//1更改为\\1 将正则表达式更改为: ^[0-9]{1,3}.[0-9]

我有一个IP地址字符串:
192.168.10.2

我想提取Ansible中IP的前三个八位组,并尝试使用这个正则表达式

{{comp_ip | regex_replace("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"), "//1"}}

这不会产生任何结果。有人能纠正我哪里出错了吗?

你做得对,你只需要在正则表达式中使用括号就可以组成一个组。最好匹配整个
ip
,并以
$
结束正则表达式,同时在代码中将
//1
更改为
\\1

将正则表达式更改为:

^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
对于此正则表达式:

^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\.[0-9]{1,3}$
这是完整的代码:

{{comp_ip | regex_replace('^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\.[0-9]{1,3}$', '\\1')}}

如果已经有点分隔的IP地址,有一个简单的方法:

{{ comp_ip.split('.')[0:3] | join('.') }}

如果您想计算网络地址,可以使用Ansibleipaddr filter,它正好提供以下功能:


您想返回
192.168.10
?是的,这是正确的。谢谢,但它在语法上有一些问题。有问题的行似乎是:set_fact:net:{{comp_ip | regex}replace('^([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}),'\\1'}^这里没有语法错误,但o/p中没有任何内容{“net”:(u'','\\\\1')}@spamulap12请尝试更新的完整代码,我做了一个小改动。顺便问一下,输入是否只有
ip
?或者它在
ip
之前和之后有什么东西吗?这是我用
code
-name:COMP-ip-set\u-fact:COMP-ip:“192.168.10.2”-name:Extract-net-set\u-fact:net:“{{COMP-ip | regex\u-replace('^[\s\s]*?([0-9]{1,3}\.[0-9]{1,3}.[\s].}.]我像前面一样得到语法错误:(完整代码有一个输入错误,regex|u replace的右括号应该在\\1
{comp|ip|regex|u replace('^([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.'\\1')}之后)
这是一个很酷的技巧,也很清楚。因此,一般来说,我们可以通过ansible中的管道使用任何python方法吗?不,管道是用于过滤器的,有关详细信息,请参见我的答案。但您可以使用带点记法的字符串和dict的python方法。
---
- hosts: localhost
  vars:
    my_ip: "{{ ansible_default_ipv4.network }}/{{ ansible_default_ipv4.netmask }}"
  tasks:
    - debug: msg="network {{ my_ip | ipaddr('network') }}"
    - debug: msg="netmask {{ my_ip | ipaddr('netmask') }}"