我有一个简单的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)
答案 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'