Ansible Regexp 组、模式还是其他什么?

Ansible Regexp 组、模式还是其他什么?

我必须使用 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 返回一个数组。

看看这是否能给你带来进一步的启发。

相关内容