我試圖寫在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