Shell Ansible-当循环中至少有一项失败时跳过任务

Shell Ansible-当循环中至少有一项失败时跳过任务,shell,ansible,sqlplus,Shell,Ansible,Sqlplus,我正在使用sqlplus present运行一些SQL脚本。在运行之前,我将从该目录获取所有sql文件列表,并将其存储在sql\u out中,如下所示 问题是,如果其中一个sql脚本失败,其余的sql脚本仍会执行。如果任何一个脚本失败,我想完全跳过该任务。有没有跳过的方法。我认为我们可以将用于_项,但不确定如何实现。有什么帮助吗 - name: "Get sql files from directory" shell: ls {{ directory }}/{{ scripts_pa

我正在使用sqlplus present运行一些SQL脚本。在运行之前,我将从该目录获取所有sql文件列表,并将其存储在
sql\u out
中,如下所示

问题是,如果其中一个sql脚本失败,其余的sql脚本仍会执行。如果任何一个脚本失败,我想完全跳过该任务。有没有跳过的方法。我认为我们可以将
用于_项
,但不确定如何实现。有什么帮助吗

  - name: "Get sql files from directory"
    shell: ls {{ directory }}/{{ scripts_path }}/*.sql
    register: sql_out
    tags:
     - sql

  - name: "Execute each SQL Scripts"
    script: sqlplus.sh {{ db_username }} {{ db_password }} {{ 
    connection_string }} {{ schema }} {{ item }} 
    delegate_to: localhost

    with_items: sql_out.stdout_lines
    tags:
     - sql

AFAIK从当前的Ansible版本2.3开始,这是不可能的

任务执行器的工作原理是,它首先执行每个循环迭代,然后才分析任务/项目结果

您应该重构shell脚本,以便能够接收脚本列表作为参数,并在脚本中迭代它们,而不是使用Ansible。这也将大大提高你的速度。

由于你没有提供“跳过任务”的详细信息,我实际上只给出了一个概念性的答案。在当前表单中,脚本将按顺序运行,如果其中一个失败,整个任务将失败。如果希望跳过其他脚本,则需要添加额外的检查

将运行任务的脚本提取到单独的文件中,并将其包含在带有_fileglob-循环的
中:

- include: runscript.yml
  with_fileglob: "{{ directory }}/{{ scripts_path }}/*.sql"
使用
runscript.yml

- script: sqlplus.sh {{ db_username }} {{ db_password }} {{ connection_string }} {{ schema }} {{ item }} 

您应该在Ansible中添加策略参数。当任务失败时,它将停止执行playbook。 '策略:调试'


-名称:安装和配置测试服务器
收集事实:真实
策略:调试
苏多:是的
主机:测试客户端
变量:
测试服务器ip:xxx.xxx.xx.xx
角色:
-{角色:工具,标记:['tools']}
-{角色:测试客户端,标记:['test-client']}

详情请参阅。我使用的是ansible 2.2.1.0

请描述您想要实现的确切场景。举例说明。描述脚本以何种方式失败。不要解析
ls
!此外,
标签对问题是否至关重要?
脚本
参数是否要求包含换行符?第一个任务是否打算在远程目标上运行,第二个任务是否打算在本地运行?因为这就是代码中的内容。你说的“不确定如何实施”是什么意思?您是否尝试运行您发布的代码,或者认为不值得尝试,最好让StackOverflow上的人为您执行此操作?我不同意,这是完全可行的。感谢您的解决方案。我已经修改了shell脚本并删除了AnsibleI中的迭代。我同意它是可行的,但不同意它是完美的。我们都知道循环包含与循环任务完全不同。这也增加了另一层复杂性和缓慢性。