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 - 当至少一个项目在循环中失败时跳过任务的主要内容,如果未能解决你的问题,请参考以下文章

Ansible - 在循环中重试失败的迭代

如何在python里面for循环中放了一个定时函数,当定时函数运行时跳过本次循环,执行那个循环

Ansible 学习总结—— Ansible 循环条件判断触发器处理失败等任务控制使用总结

Ansible 学习总结—— Ansible 循环条件判断触发器处理失败等任务控制使用总结

ansible自动化运维详解ansible中的任务执行控制及实例演示:循环条件判断触发器处理失败任务

ansible自动化运维详解ansible中的任务执行控制及实例演示:循环条件判断触发器处理失败任务