【问题标题】:Ansible - Skip task when at least one item fails in loopAnsible - 当至少一个项目在循环中失败时跳过任务
【发布时间】: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 参数是否需要您包含的换行符?第一个任务是要在远程目标上运行,而第二个任务是在本地运行吗?因为这就是代码中的内容。 “不确定如何实施”是什么意思?您是否尝试运行您发布的代码,或者认为不值得尝试并最好让 StackOverflow 上的某个人为您执行此操作?

标签: shell ansible sqlplus


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2016-10-24
    • 2022-01-08
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多