Error handling Ansible-在循环任务期间检查任务失败';行刑

Error handling Ansible-在循环任务期间检查任务失败';行刑,error-handling,ansible,Error Handling,Ansible,我有一个任务,它应该运行SQL脚本列表。如果在执行序列中的任何脚本时出现错误,则任务应停止执行 给定以下任务,是否有一种方法可以修改它以查看循环当前迭代的寄存器标准输出,以检查标准输出中是否有'ERROR' - name: Build and run SQLPlus commands shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}' register: sh1

我有一个任务,它应该运行SQL脚本列表。如果在执行序列中的任何脚本时出现错误,则任务应停止执行

给定以下任务,是否有一种方法可以修改它以查看循环当前迭代的寄存器标准输出,以检查标准输出中是否有
'ERROR'

- name: Build and run SQLPlus commands
  shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}'
  register: sh1
  with_items:
    - ["a.sql", "b.sql"]
#      failed_when: "'ERROR' in sh1.stdout_lines"
我在想上一条注释行的内容,但由于
sh1
是循环任务的寄存器变量,因此每个SQL脚本的输出都位于
sh1
的列表
results
中;因此,我不确定如何访问刚刚执行的命令的特定stdout

我在想上一句话的大意

到目前为止,您的想法是正确的,因此只需取消注释该行:

- name: Build and run SQLPlus commands
  shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}'
  register: sh1
  with_items:
    - ["a.sql", "b.sql"]
  failed_when: "'ERROR' in sh1.stdout_lines"
但是由于
sh1
是循环任务的寄存器变量,因此每个SQL脚本的输出都位于
sh1
的列表
结果中

否。在任务中,
sh1
字典中的值可以在每次迭代中直接访问(没有列表)。列表
sh1。对于后续任务,结果将可见


但上述操作不会中断整个循环的执行,而Ansible就是这样设计的。因此,要实现以下目标

如果在执行序列中的任何脚本的过程中出现错误,则任务应停止执行

您可以使用一种变通方法:将任务保存到单独的文件中,然后迭代包含任务(请参阅)

我在想上一句话的大意

到目前为止,您的想法是正确的,因此只需取消注释该行:

- name: Build and run SQLPlus commands
  shell: 'echo @{{ item }} | {{ sqlplus }} {{ db_user }}/{{ db_pass }}@{{ environment }}'
  register: sh1
  with_items:
    - ["a.sql", "b.sql"]
  failed_when: "'ERROR' in sh1.stdout_lines"
但是由于
sh1
是循环任务的寄存器变量,因此每个SQL脚本的输出都位于
sh1
的列表
结果中

否。在任务中,
sh1
字典中的值可以在每次迭代中直接访问(没有列表)。列表
sh1。对于后续任务,结果将可见


但上述操作不会中断整个循环的执行,而Ansible就是这样设计的。因此,要实现以下目标

如果在执行序列中的任何脚本的过程中出现错误,则任务应停止执行


您可以使用一种变通方法:将任务保存到一个单独的文件中,然后迭代包含任务(请参见)。

如果shell命令返回非零退出代码,任务将自动失败。您不必执行任何操作。@helloV出错的不是命令,该命令使用sqlplus执行SQL脚本,如果脚本运行不正确,sqlplus的输出将包含“错误”一词。我知道shell命令正在成功执行,因为在使用
echo$?
跟踪sqlplus命令之后,我得到了一个退出代码0。如果shell命令返回非零退出代码,任务将自动失败。您不必执行任何操作。@helloV出错的不是命令,该命令使用sqlplus执行SQL脚本,如果脚本运行不正确,sqlplus的输出将包含“错误”一词。我知道shell命令正在成功执行,因为在使用
echo$?
跟踪sqlplus命令之后,我得到了一个退出代码0。感谢您提供的详细信息,特别是提供了一个示例。我有一个类似于在包含上循环的想法——在块上循环。遗憾的是,它还没有实现,他们建议按照你说的那样做,所以我认为这是我最好的选择。根据,动态包含的任务没有输出:“仅存在于动态包含中的任务不会显示在–list tasks output中。”仅当我将先前定义的寄存器变量用于
和\u fileglob
时,才会发生这种情况。将其更改为
with_items
会起作用,我可以看到包含的任务的输出。对于那些试图使用最新实践的人,显然该模块已被弃用,但直到2.4才可用;因此,请确保您使用了正确的模块。感谢您提供的详细信息,特别是提供了一个示例。我有一个类似于在包含上循环的想法——在块上循环。遗憾的是,它还没有实现,他们建议按照你说的那样做,所以我认为这是我最好的选择。根据,动态包含的任务没有输出:“仅存在于动态包含中的任务不会显示在–list tasks output中。”仅当我将先前定义的寄存器变量用于
和\u fileglob
时,才会发生这种情况。将其更改为
with_items
会起作用,我可以看到包含的任务的输出。对于那些试图使用最新实践的人,显然该模块已被弃用,但直到2.4才可用;因此,请确保您使用的是正确的模块。