我必须使用 ansible 来管理一些 DNS 区域。我们使用剧本和一些模板,没有任何问题。但是,区域的序列号是由最终用户手动修改的,很多时候他们都会忘记更新它。
因此,我想创建一个任务,从区域文件中解析当前序列,然后更新它(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 返回一个数组。
看看这是否能给你带来进一步的启发。