Ansible Playbooks中IP范围的正则表达式匹配用于分组

时间:2016-08-02 15:52:59

标签: python regex ansible ansible-playbook

我正在尝试为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]'

grouping picture

6 个答案:

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

我尝试比较它的网络。所以我厌倦了@ebel建议的东西,它按照我想要的方式工作。谢谢

enter image description here