本来打算自己写一波 ansible 系列的,后来发现一老哥写的太好了,「点击此处直达」,我这里也就边看边对该系列文章做下笔记,方便以后查阅,ansible 入门的话墙裂建议阅读前方链接博文~~~
这里说的 ansible 中的错误处理类似于编程语言中的 try ... catch ... finally
语句块,即控制当任务出现错误时后续的执行流程。
错误处理功能就是当某任务出错时,执行指定的其他任务。
打个比方,我们想要在 A 任务执行失败时执行 B 任务,如果 A 任务执行成功,则无需执行 B 任务。
我们可以使用条件判断来实现这个功能,看如下示例:
---
- hosts: B
gather_facts: no
tasks:
- name: A
shell: 'ls /ooo'
register: return_value
ignore_errors: true
- name: B
debug:
msg: "I cought an error"
when: return_value is failed
这里既然单独把错误处理拿出来说了,肯定有专门针对此种情况的解决办法啦~
那就是使用 block
和 rescue
关键字来实现,依旧是实现上述功能,对比看如下实例:
---
- hosts: B
gather_facts: no
tasks:
- block:
- shell: 'ls /ooo'
rescue:
- debug:
msg: 'I caught an error'
如上例所示,我定义了一个 block,这个 block 中有一个任务,这个任务在目标主机中执行了 ls /ooo
命令,除了 block 关键字,还有另外一个关键字 rescue
,rescue
关键字与 block
关键字对齐。
rescue
的字面意思为救援,表示当 block
中的任务执行失败时,会执行 rescue
中的任务进行补救,当然,在 rescue
中定义什么任务,是由你决定的,上述示例主要是为了说明,当 block
中的任务出错时,会执行 rescue
中的任务,当 block
中的任务顺利执行时,则不会执行 rescue
中的任务,是不是很像编程语言中的 try ... cacth ...
块~~
其实,我们还能够再加入 always
关键字,加入 always
关键字以后,无论 block
中的任务执行成功还是失败,always
中的任务都会被执行,示例如下:
---
- hosts: B
gather_facts: no
tasks:
- block:
- debug:
msg: 'I execute normally'
- command: /bin/false
- debug:
msg: 'I never execute, due to the above task failing'
rescue:
- debug:
msg: 'I caught an error'
- command: /bin/false
- debug:
msg: 'I also never execute'
always:
- debug:
msg: "This always executes"
如上例所示,block
中有多个任务,rescue
中也有多个任务,上例中故意执行 /bin/false
命令,模拟任务出错的情况。
当 block
中的 /bin/false
执行后,其后的 debug 任务将不会被执行,因为 /bin/false
模拟出错,出错后直接执行 rescue
中的任务,在执行 rescue
中的任务时,会先输出 I caught an error
,然后又在 rescue
中使用 /bin/false
模拟出错的情况,出错后之后的 debug 任务不会被执行,直接执行 always
中的任务,always
中的任务一定会被执行,无论block中的任务是否出错,现在是不是就很像编程中的 try ... catch ... finally
块啦~~~
评论区