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

Ansible循环调用include_role时获取tasks_from返回值方法

问题原因

默认include_role使用独立的私有变量作用域,角色内部通过register定义的srq变量不会向外层透传,因此外层循环注册的result仅会返回include_role本身的执行元数据,不会携带角色内任务的返回值,自然无法直接提取工单编号。

实现方法

完全可以实现收集所有工单编号为数组的需求,按如下步骤修改配置即可:

  • 给include_role添加public: true参数,放开角色变量的作用域限制,让角色内部注册的srq变量可以在外层上下文访问。
  • 提前初始化一个空数组用于存储工单号,避免变量残留导致结果异常。
  • 由于循环执行时每次迭代都会覆盖srq变量的值,需要在单轮角色执行完成后,立刻将当前生成的工单号追加到数组中。

修改后的roles/request_signed_certificate/tasks/main.yaml代码

# 初始化存储工单号的空数组
- name: Initialize SRQ number array
  set_fact:
    srq_numbers: []

# 循环处理每个CSR,创建工单并收集编号
- name: Process CSR list
  block:
    - name: Create SNOW Records for Certificate Request
      include_role:
        name: servicenow
        tasks_from: create_srq.yaml
        public: true
      vars:
        short_description: CSR for {{ csr.certname }}-{{ csr.env }}
        attachment: "{{ cert_path }}/{{ csr.certname }}-{{ csr.env }}.csr"

    - name: Append current SRQ number to array
      set_fact:
        srq_numbers: "{{ srq_numbers + [srq.record.number] }}"
  loop: "{{ spreadsheet }}"
  loop_control:
    loop_var: csr

# 输出收集到的所有工单号
- name: Show collected SRQ numbers
  debug:
    var: srq_numbers

说明

  • 这里用block把调用角色和追加编号的两个任务包到同一个循环里,保证每轮循环执行完角色逻辑后,立刻读取当前轮次生成的srq变量提取工单编号,不会被下一轮循环的值覆盖。
  • 循环全部执行完成后,srq_numbers变量就是需要的、由所有创建成功的工单编号组成的数组,可以直接在后续任务中使用。
  • 该方案要求Ansible版本不低于2.7(public参数从2.7版本开始引入),目前主流使用的Ansible版本均满足该要求。

内容的提问来源于stack exchange,提问作者Kris Reese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:57:19