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 格式不规范,建议先检查每个输入是否恰好匹配一个域名,再使用结果。这个示例适用于题目给出的域名列表和输入格式。
备注:内容仅供参考。
