我使用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
答案 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