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 的建议,它按照我想要的方式工作。谢谢
我正在尝试为示例 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 的建议,它按照我想要的方式工作。谢谢