【问题标题】:Conditionnal 'changed_when' based on output in a 'with_items' task基于“with_items”任务中的输出的条件“changed_when”
【发布时间】:2018-11-19 11:59:31
【问题描述】:

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

问题是在with_items 生成结果列表的同时使用register。而且我找不到访问当前循环迭代的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)

【问题讨论】:

  • 以下answer 对我没有帮助,因为它在下一个任务中处理它,而更新我假设的任务状态为时已晚。
  • 这也是在 2 个任务中完成的。它不会帮助我获得初始任务的正确状态。

标签: loops ansible


【解决方案1】:

我遇到了类似的问题,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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2021-08-19
    • 1970-01-01
    • 2020-05-12
    • 2022-07-29
    相关资源
    最近更新 更多