Ansible Playbooks 中 IP 范围的正则表达式匹配以进行分组

Regular expression matching for IP range in Ansible Playbooks for grouping

我正在尝试为示例 ip 范围的 ansible-playbook 中的动态组编写正则表达式。 如果地址范围是 172.30.0.(0 到 254)。(0 到 254)。我的正则表达式就像 172.30.[0-254].[0-254]。这个对吗 ?即使我在范围内有主机,任务也被跳过并且没有组被形成。

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

[0-225] 是不正确的正则表达式。 []定义ACII中一个字符到另一个字符的字符范围table而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]?)

正如这个 post 所说:Regex to match an IP address

您可能想使用 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')

正则表达式不是一个很好的工具。

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

当使用运算符“==”时,您将在 python 中尝试查找名称为“172.30.[0-254[. [0-254]'

在 ansible 中,你可以使用 python 表达式,如搜索或匹配。

因此您需要输入如下内容:

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

做了一个测试ansible playbook来验证。

如果你比较网络,你不应该关心范围!

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')

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