如何将Ansible首个任务结果传递至其他文件的任务块
解决Ansible循环捕获结果并按需执行任务的问题
问题分析
你原代码的核心问题在于:尝试通过字符串拼接变量名('{{ item }}_result'.rc)判断执行结果,但Ansible无法直接解析这种字符串形式的变量引用,导致条件判断失效。同时,单独为每个循环item注册独立变量的方式不够高效,推荐利用Ansible循环注册的特性,将所有结果统一存到一个列表中。
正确实现方案
1. 主任务文件修改
将第一个任务的结果注册到一个统一变量(Ansible会自动把循环的每个结果存入该变量的results列表),然后遍历这个结果列表,仅针对执行失败(rc != 0)的item调用任务文件:
- name: 执行初始化操作 shell: abc # 替换为你实际要执行的与item相关的命令,比如{{ item.some_field }} register: setup_results loop: "{{ setu }}" - name: 针对初始化失败的item执行修复任务 include_tasks: abc.yml loop: "{{ setup_results.results }}" when: item.rc != 0 loop_control: loop_var: setup_result # 将原循环中的item传递给abc.yml使用 vars: target_item: "{{ setup_result.item }}"
2. abc.yml任务文件修改
使用传递过来的target_item引用原setu中的字段:
- name: step1 执行修复步骤1 shell: "{{ target_item.set }}" - name: step2 执行修复步骤2 shell: "{{ target_item.sertt }}"
备选方案(保留独立变量名)
如果一定要为每个item单独注册变量,可以通过hostvars动态引用变量名,写法如下:
- name: Set-up shell: abc register: "{{ item }}_result" loop: "{{ setu }}" - name: 针对失败的item执行任务 include_tasks: abc.yml loop: "{{ setu }}" when: hostvars[inventory_hostname][item ~ '_result'].rc != 0 loop_control: vars: target_item: "{{ item }}"
这种方式需要确保变量名拼接正确,同时abc.yml中同样使用target_item访问字段。
内容的提问来源于stack exchange,提问作者user312307
相关产品推荐
相关产品推荐

