知识点shell 、block、ignore_errors
---
- name: disable selinux
hosts: new
gather_facts: false
tasks:
- name: selinux diable
shell: setenforce 0
- name: disable forever in config
lineinfile:
path: /etc/selinux/config
line: "SELINUX=disabled"
regexp: '^SELINUX='
在使用shell模块执行setenforce 0命令的时候,发现该命令的退出状态码不是0,所以Ansible认为这是个失败的命令,于是终止了play,后面的任务也不再执行。但其实我们自己明确地知道,这个命令是没错的,而且从上面的stderr的内容中也可以看出,setenforce命令给了我们正确的反馈。
使用Ansible去执行命令,可能经常会遇到类似问题,Ansible并没有那么聪明,它默认只认退出状态码0,其它退出状态码全认为是失败的。
所以,需要让Ansible去处理这种异常。处理异常的方式有很多种,这里只介绍最简单的一种:ignore_errors,
ignore_errors指令正如其名,表示忽略失败的任务,直接将值设置为true即可。
---
- name: disable selinux
hosts: new
gather_facts: false
tasks:
- name: disable on the fly
shell: setenforce 0
ignore_errors: true
- name: disable forever in config
lineinfile:
path: /etc/selinux/config
line: "SELINUX=disabled"
regexp: '^SELINUX='
使用ignore_errors虽然简单,但不是很友好。各位去执行一下上面的playbook,会发现它仍然会将报错信息输出在终端或指定的日志文件中,只不过它不会因为任务失败而导致整个play的中止。但无论如何,它能达到我们的目标:在遇到错误的时候继续执行下去。
实际上,几乎所有任务级别的指令(除循环类指令外,比如loop)都可以写在block级别上,它们会拷贝到Block内部的所有任务上(也可也看作是block内部的任务继承block级别上的指令)。例如:
---
- name: disable selinux
hosts: new
gather_facts: false
tasks:
- block:
- shell: ls /tmp/a.log
- shell: ls /tmp/b.log
ignore_errors: true