2016-08-02 199 views
2

我试图写在ansible,剧本为样本IP范围动态组正则表达式。 如果地址范围是172.30.0。(0到254)。(0到254)。我的正则表达式类似于 172.30。[0-254]。[0-254]。它是否正确 ?即使我有主机在范围内,任务正在跳过,并没有组正在形成。正则表达式的IP范围Ansible剧本匹配的分组

任务: - GROUP_BY: '172.30 [0-254] [0-254]':键= ADDA 当ansible_default_ipv4.network ==

grouping picture

+0

的可能的复制[正则表达式:如何匹配RFC1918私有IPv4地址范围的IP地址(在Python)](http://stackoverflow.com/questions/30674845/regex-how-to -match-ip-address-in-rfc1918-private-ipv4-address-ranges-in-python) – TessellatingHeckler

+0

请将代码作为文本发布,而不是未来的图像。 – tedder42

回答

2

当使用操作 '==',那么在Python中,你正在努力寻找一个匹配的字符串以名称 '172.30。[0-254 [[0-254]'

在ansible可以使用Python表达式像搜索或匹配。

所以,你需要这样的输入的东西:

when: ansible_default_ipv4.address | match("172.30.") 

做了一个测试ansible剧本进行验证。

1

[0-225]是一个不正确的正则表达式。 []在ACII表中定义一个字符范围从一个字符到另一个字符,而255不是一个ASCII字符。

通过(?:25[0-4]|2[0-4][0-9]|[01]?[0-9][0-9]?)

代替它,因此完整的正则表达式是:

173\.30\.(?:25[0-4]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-4]|2[0-4][0-9]|[01]?[0-9][0-9]?)

为这篇文章说:Regex to match an IP address

+0

我的答案似乎与我无关:p。我不认为你在这里使用的是真的可以称为正则表达式。 – baddger964

+0

我希望有人会发布这个 - 不仅有更好的方法,正则表达式也是错误的。 – tedder42

0

你可能想使用Jinja2 match过滤器来匹配正则表达式:

类似这样的:

--- 

- hosts: localhost 
    gather_facts: no 
    connection: local 
    vars: 
    ip_not_ok: '172.31.0.1' 
    ip_ok: '172.30.0.1' 
    tasks: 
    - debug: msg='OK' 
    when: ip_ok | match('172.30') 

    - debug: msg='OK' 
    when: ip_not_ok | match('172.30') 
+0

不幸的是,这个正则表达式不符合预期的IP地址。 –

+0

这一点不在正则表达式,但在'匹配'过滤器 – Vor

0

正则表达式是不是好工具。

from ipaddress import ip_address 
import operator 

def ip_check_range(ranges, s): 
    return all(map(operator.contains, 
     ranges, 
     ip_address(s).packed 
    )) 

print(ip_check_range([[172], [30], range(255), range(255)], '172.30.1.2')) # => True 
print(ip_check_range([[172], [30], range(255), range(255)], '172.30.1.255')) # => False 

另外,如果你在Python的< 3.3,并且没有ipaddress模块:

def ip_check_range(ranges, s): 
    ip = s.split('.') 
    if len(ip) != 4: 
     raise ValueError 
    return all(map(operator.contains, 
     ranges, 
     (int(octet) for octet in ip) 
    )) 
0

如果你比较网络,你不应该在乎的范围!

tasks: 
    - group_by: key=adda 
    when: ansible_default_ipv4.network == '172.30.0.0' 

这将(通常)匹配IP为172.30.0.1 - 172.30.255.255的所有主机。

如果你需要比较的IP地址,使用ipaddr过滤:

tasks: 
    - group_by: key=adda 
    when: ansible_default_ipv4.address | ipaddr('172.30.0.0/16') | ipaddr('bool') 
+0

这意味着python-netaddr已经安装到控制器。 – ebal

+0

非常感谢你,我没有安装python-netaddr,所以我尝试了@ebal的建议和它的工作。由于某种原因,网络比较仍然无效。如果需要,我还会查看ipaddr过滤器。 –

0

我试着比较网络它工作了。所以我厌倦了@ebel的建议,它按我想要的方式工作。由于

enter image description here