You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:45:30