
Tengo que usar ansible para administrar algunas zonas DNS. Usamos un libro de jugadas y algunas plantillas sin ningún problema. Sin embargo, el número de serie de la(s) zona(s) es modificado manualmente por los usuarios finales y muchas veces se olvidan de actualizarlo.
Entonces, quiero crear una tarea que analice el número de serie actual del archivo de zona y luego lo actualice (formato AAAAMMMDDXX).
Mi principal preocupación en este momento es cómo conseguir el serial actual. Tengo la tarea actual:
- name: Get current serial in zone file
lineinfile:
path: "{{ bind_zone_file }}"
regexp: "\s*(\d{10})\s*\;Serial"
register: current_serial
Funciona como se esperaba, por supuesto. Sin embargo, no es muy útil ya que necesito trabajar mucho con él.
Mi pregunta es:
¿Cómo registro solo la parte \1 de la expresión regular?
Respuesta1
Puede que esto sea un poco indirecto, pero yo tenía una necesidad similar. Usé un filtro. Aplicando eso a su escenario, creo que se ve así:
- 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 }}"
La parte interesante es el uso de \\1
en regex_search. | first
es necesario porque regex_search en este formulario devuelve una matriz.
A ver si esto te inspira más.