Ansible - 当至少一个项目循环失败时跳过任务

时间:2017-06-27 06:46:02

标签: shell ansible sqlplus

我使用sqlplus存在运行少量SQL脚本。在运行之前,我从该目录获取所有sql文件列表,并将其存储在sql_out中,如下所示。

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

  - 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

3 个答案:

答案 0 :(得分:3)

AFAIK从现有的Ansible 2.3版本开始就不可能。

任务执行器在such way中工作,它首先执行每个循环迭代,然后才分析任务/项目结果。

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

答案 1 :(得分:3)

由于您没有提供有关" 跳过任务"的详细信息,我实际上只发布了一个概念答案。在当前形式中,脚本将按顺序运行,如果一个失败,则整个任务将失败。如果您希望跳过其他脚本,则需要添加其他检查。

将脚本运行任务解压缩到一个单独的文件并将其包含在with_fileglob循环中:

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

runscript.yml

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

答案 2 :(得分:0)

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

- name: Install & Configure Test server gather_facts: True strategy: debug sudo: yes hosts: test-client vars: test_server_ip: xxx.xxx.xx.xx roles: - { role: tools, tags: ['tools']} - { role: test-client, tags: ['test-client']} 可以找到详细信息here。我使用的是ansible 2.2.1.0