2017-09-22 31 views
0

我有一个应该运行SQL脚本列表的任务。如果在序列中执行ANY脚本期间发生错误,则该任务应该停止执行。Ansible - 在循环任务执行期间检查任务是否失败

给出以下任务,是否有方法可以修改它以查看当前迭代循环的寄存器stdout,以检查'ERROR'是否在stdout中?

- name: Build and run SQLPlus commands 
    shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}' 
    register: sh1 
    with_items: 
    - ["a.sql", "b.sql"] 
#  failed_when: "'ERROR' in sh1.stdout_lines" 

我在想沿着最后的注释行线的东西,但由于sh1是一个循环任务寄存器变量,从每个SQL脚本的输出所在的列表sh1results内;所以我不确定如何访问刚刚执行的命令的特定标准输出。

+0

如果shell命令返回非零退出代码,任务将自动失败。你不必做任何事情。 – helloV

+0

@helloV这不是错误的命令,该命令使用sqlplus执行SQL脚本,如果脚本没有正确运行,sqlplus的输出包含单词“ERROR”。我知道shell命令执行成功,因为在使用'echo $?'跟踪sqlplus命令后,我得到退出码0“ –

回答

1

我在想沿着最后的注释行线的东西,

到现在为止,你是正确的思维,所以才取消对该行:

- name: Build and run SQLPlus commands 
    shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}' 
    register: sh1 
    with_items: 
    - ["a.sql", "b.sql"] 
    failed_when: "'ERROR' in sh1.stdout_lines" 

但由于sh1是循环任务的寄存器变量,每个SQL脚本的输出位于列表中resultssh1;

否。在任务中,sh1字典中的值可以在每次迭代中直接访问(没有列表)。列表sh1.results将在随后的任务中可见。


但是,上述不会破坏整个循环的执行,这是Ansible的设计。因此要实现以下内容...

如果在执行序列中的任意脚本期间发生错误,则应该停止执行该任务。

您可以使用一种变通方法:将任务保存到一个单独的文件和迭代include任务(见this answer)。

+0

感谢您的详细信息,尤其是提供示例。我有一个类似于循环包括循环块的想法。可悲的是,它还没有实现,并且[这里](https://github.com/ansible/ansible/issues/13262)他们建议按你说的去做,所以我想这是我最好的选择。 –

+0

根据[Ansible Docs](http://docs.ansible.com/ansible/latest/playbooks_reuse.html),对于动态包含的任务没有输出:“只存在于动态包含内的任务不会显示in -list-tasks输出“。这只发生在我为'with_fileglob'使用先前定义的寄存器变量时。将其更改为'with_items'可以工作,我可以看到已包含任务的输出。 –

+0

对于那些试图使用最新的做法,显然[包括](http://docs.ansible.com/ansible/latest/include_module.html)模块已被弃用,但[include_tasks](http:// docs.ansible.com/ansible/latest/include_tasks_module.html)直到2.4才可用;所以请确保您使用的是正确的模块。 –

相关问题