如何在Ansible循环include_role时不修改角色保留输出变量值?
问题描述
现有一个Ansible角色,接收输入参数后执行逻辑,最终通过set_fact模块将结果写入变量my_output_var。当循环调用该角色时,my_output_var的值会被每次迭代覆盖。在不允许修改该角色的前提下,如何将每次角色执行的my_output_var值保存到一个列表中?
尝试过用register捕获角色执行输出,但无法得到预期的my_output_var值。
可行解决方案
可以通过在循环迭代中先执行角色获取当前结果,再将结果追加到列表的方式实现。具体步骤如下:
- 借助
default过滤器自动初始化结果列表(无需单独提前声明) - 循环遍历参数列表,每次迭代中先调用目标角色,再将当前的
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
相关产品推荐
相关产品推荐

