¿Grupos Ansible Regexp, patrones o algo más?

¿Grupos Ansible Regexp, patrones o algo más?

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 \\1en regex_search. | firstes necesario porque regex_search en este formulario devuelve una matriz.

A ver si esto te inspira más.

información relacionada