可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am running few SQL scripts using sqlplus present. Before running I am getting all the list of sql files from that directory and storing it in sql_out
as shown below.
The problem is if one of the sql script fails the rest of the sql scripts still executes. I want to skip the task completely if any one of the script fails. Is there any way to skip. I reckon we can use with_items
but not sure how to implement. Any help?
- 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
回答1:
AFAIK this is not possible as of current Ansible version 2.3.
Task executor works in such way that it executes every loop iteration first and only then analyzes task/items results.
You should refactor your shell script to be able to receive scripts list as parameter and iterate them inside the script, not with Ansible. This will also give you significant speed boost.
回答2:
As you have not provided details on what do you mean by "skip task", I actually post only a concept answer. In the current form, the scripts will be run sequentially and if one fails, the whole task will fail. If you want other scripts to be skipped, you need to add additional check.
Extract the script-running task to a separate file and include it in a with_fileglob
-loop:
- include: runscript.yml with_fileglob: "{{ directory }}/{{ scripts_path }}/*.sql"
with runscript.yml
:
- script: sqlplus.sh {{ db_username }} {{ db_password }} {{ connection_string }} {{ schema }} {{ item }}
回答3:
You should add Strategy parameter in Ansible. It will stop executing playbook as task fails. 'strategy: debug'
- 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']}
Details can be found here. I am using ansible 2.2.1.0