2016-08-02 11 views
2

Ich versuche, einen regulären Ausdruck für eine dynamische Gruppe in Ansible-Playbook für einen Sample-IP-Bereich zu schreiben. Wenn der Adressbereich 172.30.0 ist (0 bis 254). (0 bis 254). Meine Regex ist wie 172,30. [0-254]. [0-254]. Ist das richtig ? Obwohl ich die Hosts im Bereich habe, werden die Aufgaben übersprungen und es werden keine Gruppen gebildet.Regulärer Ausdruck für IP-Bereich in Ansible Playbooks für Gruppierung

Aufgaben: - group_by: '. 172.30 [0-254] [0-254]': key = adda wenn ansible_default_ipv4.network ==

grouping picture

+0

Mögliches Duplikat [Regex: Wie privaten IPv4-Adressbereiche (in Python) in RFC1918 IP-Adresse übereinstimmen] (http://stackoverflow.com/questions/30674845/regex-how-to -match-ip-adresse-in-rfc1918-private-ipv4-adresse-bereiche-in-python) – TessellatingHeckler

+0

Bitte Code als Text, kein Bild, in der Zukunft. – tedder42

Antwort

2

Bei Verwendung des Betreibers == 'dann in Python versuchen Sie zu finden, eine übereinstimmende Zeichenkette mit dem Namen '172.30. [0-254 [. [0-254]'

In ansible können Sie Python-Ausdruck wie Suche oder Übereinstimmung verwenden.

Sie müssen also so etwas geben:

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

habe einen Test ansible Textbuch um es zu überprüfen.

1

[0-225] ist eine falsche regex . [] Definiert einen Zeichenbereich von einem Zeichen bis zu einem anderen Zeichen in der ACII-Tabelle und 255 ist kein ASCII-Zeichen.

ersetzen Sie es durch (?:25[0-4]|2[0-4][0-9]|[01]?[0-9][0-9]?)

So ist die komplette regex ist:

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

wie dieser Beitrag sagte: Regex to match an IP address

+0

Meine Antwort scheint mir jetzt irrelevant: p. Ich denke nicht, was Sie hier verwenden, kann wirklich Regex genannt werden. – baddger964

+0

Ich hatte gehofft, jemand würde dies posten - nicht nur gibt es bessere Wege, die Regex war auch falsch. – tedder42

0

Sie wahrscheinlich Jinja2 match Filter verwenden möchten Regex entsprechen:

Etwas wie dieses:

--- 

- 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

Leider stimmt diese Regex nicht mit den erwarteten IP-Adressen überein. –

+0

Der Punkt ist nicht auf Regex, sondern in 'match' Filter – Vor

0

Regex ist kein gutes Werkzeug dafür.

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 

Alternativ Wenn Sie auf Python sind < 3.3 und haben nicht ipaddress Modul:

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

Wenn Sie Netzwerke vergleichen, sollten Sie Bereiche nicht interessieren!

tasks: 
    - group_by: key=adda 
    when: ansible_default_ipv4.network == '172.30.0.0' 

Dies wird (im Allgemeinen) alle Hosts mit IPs 172.30.0.1 - 172.30.255.255 übereinstimmen.

Wenn Sie IP-Adressen zu vergleichen, verwenden ipaddr Filter:

tasks: 
    - group_by: key=adda 
    when: ansible_default_ipv4.address | ipaddr('172.30.0.0/16') | ipaddr('bool') 
+0

Das bedeutet, dass python-netaddr bereits auf dem ansible Controller installiert ist. – ebal

+0

Vielen Dank, ich habe Python-netaddr nicht installiert, also habe ich versucht, was @ebal vorgeschlagen hat und es hat funktioniert. Aus irgendeinem Grund funktionierte der Netzwerkvergleich immer noch nicht. Ich werde auch auf den ipaddr-Filter schauen, falls erforderlich. –

0

I Netzwerke versucht zu vergleichen, um es zu arbeiten. Also habe ich müde, was @ebel vorgeschlagen hat und es hat so funktioniert, wie ich es wollte.Dank

enter image description here