我有一个应该运行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}};所以我不确定如何访问刚刚执行的命令的特定标准输出。
答案 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)。