Ansible Regexp-Gruppen, Muster oder etwas anderes?

Ansible Regexp-Gruppen, Muster oder etwas anderes?

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 \\1in der regulären Ausdruckssuche. | firstDies ist erforderlich, da die reguläre Ausdruckssuche in dieser Form ein Array zurückgibt.

Schauen Sie, ob Sie dadurch weiter inspiriert werden.

verwandte Informationen