如何在Ansible剧本循环中获取每个角色的执行结果
解决Ansible循环调用角色并收集结果的问题
当你用include_role结合loop时,默认register只会记录这个任务本身的执行状态,拿不到角色内部的自定义结果变量。要实现需求,需要两步操作:
1. 改造角色,暴露执行结果
在ansible_role_setup_server角色的任务文件末尾,把需要收集的结果(比如success_or_failure)通过set_fact设置为主机事实,让外部剧本能捕获到这些数据:
# roles/ansible_role_setup_server/tasks/main.yml # (角色原有任务逻辑...) - name: 将角色执行结果存入主机事实 set_fact: server_setup_result: success_or_failure: "{{ success_or_failure }}" # 可按需添加其他需要收集的字段,如error_msg、setup_details等
2. 调整剧本,提取并整理结果
修改你的剧本,先循环调用角色,再遍历register返回的结果数组,把每台服务器的主机名和对应角色结果组装成目标列表:
- name: 为每台服务器执行初始化角色 include_role: name: "ansible_role_setup_server" vars: host_name: "{{ item.host_name }}" loop: "{{ server_list }}" register: execution_result - name: 整理所有服务器的执行结果 set_fact: server_final_results: >- {{ server_final_results | default([]) + [ { "host_name": item.item.host_name, "execution_status": item.ansible_facts.server_setup_result.success_or_failure # 按需添加其他从角色获取的字段 } ] }} loop: "{{ execution_result.results }}"
完成后,server_final_results变量就是包含每台服务器主机名和对应执行结果的列表,完全符合你的需求。
关键细节说明
execution_result.results是循环任务返回的结果数组,每个元素对应一次include_role的执行实例item.item指向循环时server_list里的原始元素(即单台服务器的信息)item.ansible_facts.server_setup_result就是角色里通过set_fact暴露的执行结果
内容的提问来源于stack exchange,提问作者room335
相关产品推荐
相关产品推荐

