基于“ with_items”任务中的输出的条件语句“ changed_when”

时间:2018-11-19 11:59:32

标签: loops ansible

我有一个简单的shell任务,即feed with_items。我只想在运行实际执行某些操作时才具有“ 已更改”状态。因此,我必须解析输出并查找« Done »。

问题是在register生成结果列表的同时使用with_items。而且我找不到访问当前循环迭代的stdout的方法。

---
- name: Test to set changed status only on when output match with 'Done'
  hosts: my-host-01
  gather_facts: no

  tasks:
    - name: Task doing stuff
      shell: |
        echo {{ item }}
      register: do_stuff
      with_items:
        - "Doing... Done!"
        - "Nothing to do"
      #changed_when: do_stuff.results[{{ item.id }}].stdout.find('Done')

    - name: Print 'do_stuff' var to debug
      debug:
        var: do_stuff
    - name: Try to access to the desired stdout
      debug:
        var: do_stuff.results[0].stdout

我想要的预期结果是:

TASK [Task doing stuff]
*************************************************************************
changed: [cnode02] => (item=Doing... Done!)
Ok: [cnode02] => (item=Nothing to do)

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,而Ansible文档中的以下示例对于理解它很有帮助:

在迭代过程中,当前项目的结果将放置在 变量:

- shell: echo "{{ item }}"
  with_items:
    - one
    - two
  register: echo
  changed_when: echo.stdout != "one"

https://docs.ansible.com/ansible/2.4/playbooks_loops.html#using-register-with-a-loop

对于您而言,带有stdout.find(...)的条件将不起作用。我已使用'"string" in var.stdout'成功地对其进行了测试:

- name: Task doing stuff
  shell: |
    echo {{ item }}
  register: do_stuff
  with_items:
    - "Doing... Done!"
    - "Nothing to do"
  changed_when: '"Done" in do_stuff.stdout'