2016-08-02 196 views
2

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

grouping picture

+0

的可能的複製[正則表達式:如何匹配RFC1918私有IPv4地址範圍的IP地址(在Python)](http://stackoverflow.com/questions/30674845/regex-how-to -match-ip-address-in-rfc1918-private-ipv4-address-ranges-in-python) – TessellatingHeckler

+0

請將代碼作爲文本發佈,而不是未來的圖像。 – tedder42

回答

2

當使用操作 '==',那麼在Python中,你正在努力尋找一個匹配的字符串以名稱 '172.30。[0-254 [[0-254]'

在ansible可以使用Python表達式像搜索或匹配。

所以,你需要這樣的輸入的東西:

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

做了一個測試ansible劇本進行驗證。

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

+0

我的答案似乎與我無關:p。我不認爲你在這裏使用的是真的可以稱爲正則表達式。 – baddger964

+0

我希望有人會發布這個 - 不僅有更好的方法,正則表達式也是錯誤的。 – tedder42

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

不幸的是,這個正則表達式不符合預期的IP地址。 –

+0

這一點不在正則表達式,但在'匹配'過濾器 – Vor

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

這意味着python-netaddr已經安裝到控制器。 – ebal

+0

非常感謝你,我沒有安裝python-netaddr,所以我嘗試了@ebal的建議和它的工作。由於某種原因,網絡比較仍然無效。如果需要,我還會查看ipaddr過濾器。 –

0

我試着比較網絡它工作了。所以我厭倦了@ebel的建議,它按我想要的方式工作。由於

enter image description here