Ansible - 在循环任务执行期间检查任务失败

时间:2017-09-22 22:11:38

标签: error-handling ansible

我有一个应该运行SQL脚本列表的任务。如果在执行序列中脚本的 ANY 期间出错,则任务应该停止执行。

鉴于以下任务,是否有一种方法可以修改它以查看寄存器当前迭代循环的寄存器stdout以检查stdout中是否有'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脚本的输出都位于列表 { {1}}的{​​1}};所以我不确定如何访问刚刚执行的命令的特定标准输出。

1 个答案:

答案 0 :(得分:1)

  

我正在思考最后一条注释行的内容,

直到现在你才正确思考,所以只需取消注释:

- 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脚本的输出都位于results列表 sh1中;

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

但是上面的内容不会破坏整个循环的执行,这就是Ansible的设计方式。所以要实现以下......

  

如果在执行序列中的任何脚本期间出错,则任务应该停止执行。

您可以使用变通方法:将任务保存到单独的文件并迭代include任务(请参阅this answer)。