
Мне приходится использовать ansible для управления несколькими зонами DNS. Мы используем playbook и несколько шаблонов без каких-либо проблем. Однако серийный номер зоны(зон) вручную изменяется конечными пользователями, и часто они забывают его обновить.
Итак, я хочу создать задачу, которая будет анализировать текущий серийный номер из файла зоны, а затем обновлять его (формат YYYMMMDDXX).
Моя главная забота на данный момент - как получить текущий серийный номер. У меня есть текущая задача:
- name: Get current serial in zone file
lineinfile:
path: "{{ bind_zone_file }}"
regexp: "\s*(\d{10})\s*\;Serial"
register: current_serial
Конечно, это работает так, как и ожидалось. Однако это не очень полезно, так как мне нужно проделать с этим много работы.
Мой вопрос:
Как зарегистрировать только часть \1 регулярного выражения?
решение1
Это может быть немного окольным путем, но у меня была похожая потребность. Я использовал фильтр. Применяя это к вашему сценарию, я думаю, это выглядит так:
- 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 }}"
Интересной частью является использование \\1
в regex_search. | first
оно необходимо, поскольку regex_search в этой форме возвращает массив.
Посмотрите, вдохновит ли это вас еще больше.