
Ich muss Ansible verwenden, um einige DNS-Zonen zu verwalten. Wir verwenden ein Playbook und einige Vorlagen ohne Probleme. Die Seriennummer der Zone(n) wird jedoch von den Endbenutzern manuell geändert und oft vergessen sie, sie zu aktualisieren.
Daher möchte ich eine Aufgabe erstellen, die die aktuelle Seriennummer aus der Zonendatei analysiert und sie dann aktualisiert (Format YYYMMMDXX).
Meine größte Sorge ist im Moment, wie ich an die aktuelle Seriennummer komme. Ich habe die aktuelle Aufgabe:
- name: Get current serial in zone file
lineinfile:
path: "{{ bind_zone_file }}"
regexp: "\s*(\d{10})\s*\;Serial"
register: current_serial
Es funktioniert natürlich wie erwartet. Es ist jedoch nicht sehr hilfreich, da ich viel Arbeit damit erledigen muss.
Meine Frage ist:
Wie registriere ich nur den \1-Teil des regulären Ausdrucks?
Antwort1
Das ist vielleicht ein bisschen umständlich, aber ich hatte ein ähnliches Bedürfnis. Ich habe einen Filter verwendet. Wenn ich das auf Ihr Szenario anwende, sieht es meiner Meinung nach so aus:
- name: Get current serial in zone file, in raw form
lineinfile:
path: "{{ bind_zone_file }}"
regexp: "\s*(\d{10})\s*\;Serial"
register: current_serial_raw
- name: Get current serial using a regex filter
set_fact:
current_serial: "{{ current_serial_raw | regex_search('\s*(\d{10})\s*\;Serial','\\1') | first }}"
Interessant ist die Verwendung von \\1
in der regulären Ausdruckssuche. | first
Dies ist erforderlich, da die reguläre Ausdruckssuche in dieser Form ein Array zurückgibt.
Schauen Sie, ob Sie dadurch weiter inspiriert werden.