Ansible - 当至少一个项目在循环中失败时跳过任务
Posted
技术标签:
【中文标题】Ansible - 当至少一个项目在循环中失败时跳过任务【英文标题】:Ansible - Skip task when at least one item fails in loop 【发布时间】:2017-06-27 06:46:02 【问题描述】:我正在运行一些使用 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
【问题讨论】:
请描述您想要实现的确切场景。举个例子。描述脚本以何种方式失败。并且不要解析ls
!
此外,tags
对这个问题至关重要吗? script
参数是否需要您包含的换行符?第一个任务是要在远程目标上运行,而第二个任务是在本地运行吗?因为这就是代码中的内容。 “不确定如何实施”是什么意思?您是否尝试运行您发布的代码,或者认为不值得尝试并最好让 *** 上的某个人为您执行此操作?
【参考方案1】:
AFAIK 从当前的 Ansible 版本 2.3 开始,这是不可能的。
任务执行器在such way 中工作,它首先执行每个循环迭代,然后才分析任务/项目结果。
您应该重构您的 shell 脚本,以便能够接收脚本列表作为参数并在脚本中迭代它们,而不是使用 Ansible。这也将显着提升您的速度。
【讨论】:
我不同意,这是完全可行的。 感谢您的解决方案。我修改了我的 shell 脚本并删除了 Ansible 中的迭代【参考方案2】:由于您没有详细说明“跳过任务”是什么意思,我实际上只发布了一个概念答案。在当前形式中,脚本将按顺序运行,如果一个失败,整个任务将失败。如果您希望跳过其他脚本,则需要添加额外的检查。
将脚本运行任务提取到单独的文件中,并将其包含在with_fileglob
-loop 中:
- include: runscript.yml
with_fileglob: " directory / scripts_path /*.sql"
runscript.yml
:
- script: sqlplus.sh db_username db_password connection_string schema item
【讨论】:
我同意它是可行的,但不同意它是完美的。我们都知道循环包含与循环任务完全不同。这也增加了另一层复杂性和缓慢性。【参考方案3】:您应该在 Ansible 中添加 Strategy 参数。当任务失败时,它将停止执行剧本。 '策略:调试'
- 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
【讨论】:
以上是关于Ansible - 当至少一个项目在循环中失败时跳过任务的主要内容,如果未能解决你的问题,请参考以下文章
如何在python里面for循环中放了一个定时函数,当定时函数运行时跳过本次循环,执行那个循环
Ansible 学习总结—— Ansible 循环条件判断触发器处理失败等任务控制使用总结
Ansible 学习总结—— Ansible 循环条件判断触发器处理失败等任务控制使用总结