我正在尝试为ansible-playbook中的动态组编写正则表达式以获取示例ip范围。 如果地址范围是172.30.0。(0到254)。(0到254)。我的正则表达式就像 172.30。[0-254] [0-254]。它是否正确 ?即使我有范围内的主机,也会跳过任务,并且不会形成任何组。
任务: - group_by:key = adda 时间:ansible_default_ipv4.network =='172.30。[0-254]。[0-254]'
答案 0 :(得分:2)
当使用运算符' == '时,在python中你试图找到一个名为'172.30的匹配字符串。[0-254 [。[0-254]'
在ansible中,您可以使用python表达式,如搜索或匹配。
所以你需要输入这样的东西:
when: ansible_default_ipv4.address | match("172.30.")
是否有一个测试ansible playbook来验证它。
答案 1 :(得分: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
答案 2 :(得分: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')
答案 3 :(得分: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)
))
答案 4 :(得分: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')
答案 5 :(得分:0)