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

如何在Ansible循环include_role时不修改角色保留输出变量值?

问题描述

现有一个Ansible角色,接收输入参数后执行逻辑,最终通过set_fact模块将结果写入变量my_output_var。当循环调用该角色时,my_output_var的值会被每次迭代覆盖。在不允许修改该角色的前提下,如何将每次角色执行的my_output_var值保存到一个列表中?

尝试过用register捕获角色执行输出,但无法得到预期的my_output_var值。

可行解决方案

可以通过在循环迭代中先执行角色获取当前结果,再将结果追加到列表的方式实现。具体步骤如下:

  1. 借助default过滤器自动初始化结果列表(无需单独提前声明)
  2. 循环遍历参数列表,每次迭代中先调用目标角色,再将当前的my_output_var值追加到结果列表

示例代码:

- name: 定义输入参数列表
  ansible.builtin.set_fact:
    list_of_parameters:
      - 1
      - 2
      - 3
      - 4

- name: 循环调用角色并收集结果
  block:
    - name: 执行目标角色
      ansible.builtin.include_role:
        name: my_role
      vars:
        my_input_var: "{{ item }}"

    - name: 将当前结果追加到列表
      ansible.builtin.set_fact:
        role_results: "{{ role_results | default([]) + [my_output_var] }}"
  loop: "{{ list_of_parameters }}"
  loop_control:
    loop_var: item

- name: 打印最终收集的结果列表
  ansible.builtin.debug:
    var: role_results
方案说明
  • 每次循环迭代中,include_role会独立执行角色逻辑,此时my_output_var会被设置为当前参数对应的结果
  • 紧接着的set_fact任务会将当前my_output_var的值追加到role_results列表中,default([])确保第一次执行时列表为空,避免报错
  • 最终role_results列表会包含所有迭代的my_output_var值,不会被后续迭代覆盖

内容的提问来源于stack exchange,提问作者K. Saudi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:45:26