如何创建可复用Ansible模板以传入组名并列出不可达服务器
解决Ansible可复用Unreachable服务器记录模板问题
核心思路
要实现支持任意主机组的不可达服务器记录,关键在于解决动态主机组传递和任务作用域的问题,下面提供两种经过验证的可行方案:
方案一:用include_tasks实现可复用任务模块
1. 编写可复用任务模板(save_unreachable.yml)
- name: 生成当前组的不可达主机列表 set_fact: unreachable_hosts: "{{ ansible_play_hosts_all | difference(ansible_play_hosts) }}" run_once: true - name: 将不可达主机写入日志文件 copy: content: | 【{{ target_group }} 组不可达服务器记录】 {% for host in unreachable_hosts %} - {{ host }} {% endfor %} dest: "./unreachable_{{ target_group }}.log" run_once: true
2. 主剧本调用示例(main_playbook.yml)
- name: 检测目标组主机连通性 hosts: "{{ target_group }}" gather_facts: no tasks: - name: 执行基础连通性测试 ping: ignore_unreachable: yes # 遇到不可达主机不终止剧本 - name: 导入不可达记录任务 include_tasks: save_unreachable.yml vars: target_group: "{{ target_group }}" # 传递目标组变量 run_once: true
3. 执行命令
ansible-playbook main_playbook.yml -e "target_group=web_servers"
方案二:用import_playbook实现可复用独立剧本
1. 编写可复用剧本模板(unreachable_check.yml)
- name: 检测{{ target_group }}组并记录不可达主机 hosts: "{{ target_group }}" gather_facts: no tasks: - name: 连通性测试 ping: ignore_unreachable: yes - name: 收集不可达主机列表 set_fact: unreachable_hosts: "{{ ansible_play_hosts_all | difference(ansible_play_hosts) }}" run_once: true - name: 写入记录文件 copy: content: "{{ unreachable_hosts | to_nice_yaml }}" dest: "./unreachable_{{ target_group }}.log" run_once: true
2. 主剧本调用示例(main.yml)
- name: 调用不可达检查剧本 import_playbook: unreachable_check.yml vars: target_group: db_servers # 指定要检测的主机组
常见错误排查
- 变量传递失败:确保
target_group变量在调用时明确传递(通过-e参数或剧本vars),避免任务作用域导致的变量丢失。 - hosts字段赋值错误:Ansible要求play的
hosts字段在解析阶段必须确定,不能用任务内生成的变量,必须通过外部传入。 - 未设置
ignore_unreachable:如果不开启该参数,剧本遇到不可达主机会直接终止,无法收集完整的不可达列表。 - 未加
run_once:收集和写入操作必须只执行一次,否则每个可达主机都会重复执行,导致日志文件被多次覆盖。
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

