侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

ansible笔记(14)之错误处理

zze
zze
2020-03-29 / 0 评论 / 0 点赞 / 553 阅读 / 2706 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

本来打算自己写一波 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

这里既然单独把错误处理拿出来说了,肯定有专门针对此种情况的解决办法啦~
那就是使用 blockrescue 关键字来实现,依旧是实现上述功能,对比看如下实例:

---
- hosts: B
  gather_facts: no
  tasks:
  - block:
      - shell: 'ls /ooo'
    rescue:
      - debug:
          msg: 'I caught an error'

如上例所示,我定义了一个 block,这个 block 中有一个任务,这个任务在目标主机中执行了 ls /ooo 命令,除了 block 关键字,还有另外一个关键字 rescuerescue 关键字与 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 块啦~~~

0

评论区