PAYATHON 2026

Ansible 如何按已知域名后缀拆分 FQDN 列表?

数据小许

可以遍历每个 FQDN 与已知域名的组合,用正则判断已知域名是否是 FQDN 的完整后缀。匹配后移除后缀,生成 unqualified 和 domain_name 字段。这种做法支持多个候选域名,也能避免把域名中的点号当作正则通配符。

示例

- hosts: localhost
  gather_facts: false
  vars:
    input_fqdns:
      - 'host1.mydomain.internal'
      - 'host2.mydomain.net'
    known_domains:
      - 'mydomain.internal'
      - 'mydomain.net'

  tasks:
    - name: 初始化结果列表
      ansible.builtin.set_fact:
        fqdn_parts: []

    - name: 按匹配的域名后缀拆分 FQDN
      ansible.builtin.set_fact:
        fqdn_parts: "{{ fqdn_parts + [{'unqualified': item.0 | regex_replace('\\.' ~ (item.1 | regex_escape) ~ '$', ''), 'domain_name': item.1}] }}"
      loop: "{{ input_fqdns | product(known_domains) | list }}"
      when: item.0 is match('^.+\\.' ~ (item.1 | regex_escape) ~ '$')

    - name: 查看结果
      ansible.builtin.debug:
        var: fqdn_parts

对于题目中的输入,fqdn_parts 的结果是:

- unqualified: host1
  domain_name: mydomain.internal
- unqualified: host2
  domain_name: mydomain.net

匹配逻辑

product(known_domains) 会将每个 FQDN 与各个已知域名组合。match 条件要求域名前至少有一个字符和一个点号,并且域名位于字符串末尾。regex_escape 会转义域名中的正则特殊字符,之后 regex_replace 会移除点号和匹配的域名后缀。

注意事项

如果某个 FQDN 没有匹配任何已知域名,它就不会加入结果列表。如果域名可能重叠,或输入的 FQDN 格式不规范,建议先检查每个输入是否恰好匹配一个域名,再使用结果。这个示例适用于题目给出的域名列表和输入格式。

备注:内容仅供参考。