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
相关产品推荐
相关产品推荐

