Ansible 如何将第一个任务的结果传递给其他文件中的任务块

问题描述 投票:0回答:1

我有一个任务如下:

-name : Set-up 
 shell: abc
 register: "{{item }}_result"
 loop: {{ setu }}
-name: set of tasks
 include_tasks: abc.yml
 when "'{{ item }}_result'.rc!=0"
 loop: {{ setu }}
 

abc.yml

   - name: step1
     shell: {{ item.set }}
   - name: step2
     shell: {{ item.sertt }}

这里第一个任务预计针对 setu 的所有项目运行。那么,如何捕获变量中所有项目的 shell 命令的结果,并循环所有项目的任务文件,同时检查 item1 result.rc ! =0 类似地,item2 result.rc!=0 等等

ansible ansible-2.x
1个回答
0
投票

loop中注册的变量始终具有保存结果列表的属性result。例如,

    - shell: echo {{ item }}_result
      register: out
      loop: "{{ setu }}"
      vars:
        setu: [a, b, c]

    - debug:
        msg: "{{ item.stdout }}"
      loop: "{{ out.results }}"
      loop_control:
        label: "{{ item.cmd }}"

给出了删节版

  msg: a_result
  msg: b_result
  msg: c_result

不可能循环。请参阅Playbook 关键字。相反,您可以循环 include_tasksimport_tasks。将要迭代的任务放入文件中。例如,

shell> cat abc.yml 
- debug:
    msg: "step1: {{ item.stdout }}"
- debug:
    msg: "step2: {{ item.stdout }}"

并迭代 include_tasks

    - include_tasks: abc.yml
      loop: "{{ out.results }}"
      loop_control:
        label: "{{ item.cmd }}"

给出了删节版

  msg: 'step1: a_result'
  msg: 'step2: a_result'
  msg: 'step1: b_result'
  msg: 'step2: b_result'
  msg: 'step1: c_result'
  msg: 'step2: c_result'

用于测试的完整剧本示例

- hosts: localhost

  tasks:

    - shell: echo {{ item }}_result
      register: out
      loop: "{{ setu }}"
      vars:
        setu: [a, b, c]

    - debug:
        msg: "{{ item.stdout }}"
      loop: "{{ out.results }}"
      loop_control:
        label: "{{ item.cmd }}"

    - include_tasks: abc.yml
      loop: "{{ out.results }}"
      loop_control:
        label: "{{ item.cmd }}"
© www.soinside.com 2019 - 2024. All rights reserved.