我试图写在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 ==
我试图写在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 ==
当使用操作 '==',那么在Python中,你正在努力寻找一个匹配的字符串以名称 '172.30。[0-254 [[0-254]'
在ansible可以使用Python表达式像搜索或匹配。
所以,你需要这样的输入的东西:
when: ansible_default_ipv4.address | match("172.30.")
做了一个测试ansible剧本进行验证。
[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
我的答案似乎与我无关:p。我不认为你在这里使用的是真的可以称为正则表达式。 – baddger964
我希望有人会发布这个 - 不仅有更好的方法,正则表达式也是错误的。 – tedder42
你可能想使用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')
不幸的是,这个正则表达式不符合预期的IP地址。 –
这一点不在正则表达式,但在'匹配'过滤器 – Vor
正则表达式是不是好工具。
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)
))
如果你比较网络,你不应该在乎的范围!
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')
这意味着python-netaddr已经安装到控制器。 – ebal
非常感谢你,我没有安装python-netaddr,所以我尝试了@ebal的建议和它的工作。由于某种原因,网络比较仍然无效。如果需要,我还会查看ipaddr过滤器。 –
的可能的复制[正则表达式:如何匹配RFC1918私有IPv4地址范围的IP地址(在Python)](http://stackoverflow.com/questions/30674845/regex-how-to -match-ip-address-in-rfc1918-private-ipv4-address-ranges-in-python) – TessellatingHeckler
请将代码作为文本发布,而不是未来的图像。 – tedder42