如何配置Ansible Playbook:若变量主机名未解析到主机IP则终止
Ansible Playbook 主机IP匹配验证方案
实现步骤与代码
以下是完整的IP匹配验证逻辑,解决Jinja2语法警告及终止判断问题:
--- - name: 验证Web应用主机IP匹配性 hosts: target_hosts gather_facts: true # 必须收集目标主机IP信息 vars: app_host: "your-app-domain.com" # 传入的应用主机名变量 tasks: - name: 查询app_host的IPv4解析记录 set_fact: resolved_ipv4: "{{ lookup('community.general.dig', app_host, 'A', wantlist=True) | default([], true) }}" - name: 查询app_host的IPv6解析记录 set_fact: resolved_ipv6: "{{ lookup('community.general.dig', app_host, 'AAAA', wantlist=True) | default([], true) }}" - name: 计算解析IP与目标主机实际IP的交集 set_fact: matched_ips: "{{ (resolved_ipv4 | intersect(ansible_facts.all_ipv4_addresses)) + (resolved_ipv6 | intersect(ansible_facts.all_ipv6_addresses)) }}" - name: 无匹配IP则终止部署 fail: msg: "错误:主机名{{ app_host }}解析IP({{ resolved_ipv4 + resolved_ipv6 }})与目标主机实际IP({{ ansible_facts.all_ipv4_addresses + ansible_facts.all_ipv6_addresses }})无重叠,终止Playbook" when: matched_ips | length == 0 # 关键:直接用表达式,不要加{{ }} - name: 确认匹配IP(可选调试) debug: msg: "成功匹配有效IP:{{ matched_ips }}"
关键语法与逻辑说明
- 解决Jinja2分隔符警告:
when条件中直接使用变量和过滤器表达式,不需要包裹{{ }},这是之前触发警告的核心原因。 - 解析记录处理:
wantlist=True强制dig返回列表格式,避免单IP结果变成字符串导致intersect过滤器失效default([], true)处理域名无A/AAAA记录的场景,避免出现空值报错
- 交集计算与终止判断:合并IPv4和IPv6的交集结果,通过
length == 0判断是否无匹配,为空则触发fail任务终止Playbook - 后续使用:
matched_ips变量保存了所有匹配的IP,后续证书生成等任务可直接引用该变量
内容的提问来源于stack exchange,提问作者siryx
相关产品推荐
相关产品推荐

