ansible系列(28)--ansible的playbook异常处理
1. playbook的异常处理
1.1 Playbook错误忽略
在 playbook 执行的过程中,难免会遇到一些错误(返回结果不为0)。由于 playbook 遇到错误后,不会执行之后的任务,不便于调试,此时,可以使用 ignore_errors 来暂时忽略错误,使得 playbook 继续执行。
首先编写一个
playbook文件:[root@xuzhichao playbook]# cat ignore.yml
- hosts: localhost
tasks:
- name: Igonre False
shell: /bin/false <==此命令返回值一定不为0 - name: Print Message
debug:
msg: "It's hard to here"
此时运行
playbook时会在Igonre False任务中报错,无法继续向下运行:[root@xuzhichao playbook]# ansible-playbook ignore.yml PLAY [localhost] ********************************************************************************************************************************************** TASK [Igonre False] *******************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "/bin/false", "delta": "0:00:00.024018", "end": "2021-08-05 21:36:36.638534", "msg": "non-zero return code", "rc": 1, "start": "2021-08-05 21:36:36.614516", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []} PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
修改
playbook文件,忽略中间task的错误,继续向下执行:[root@xuzhichao playbook]# cat ignore.yml
- hosts: localhost
tasks:
- name: Igonre False
shell: /bin/false
ignore_errors: yes - name: Print Message
debug:
msg: "It's hard to here"
此时运行
playbook会忽略掉中间task的错误,继续向下运行:[root@xuzhichao playbook]# ansible-playbook ignore.yml PLAY [localhost] ********************************************************************************************************************************************** TASK [Igonre False] *******************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "/bin/false", "delta": "0:00:00.004268", "end": "2021-08-05 21:37:16.630140", "msg": "non-zero return code", "rc": 1, "start": "2021-08-05 21:37:16.625872", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring <==忽略错误 TASK [Print Message] ******************************************************************************************************************************************
ok: [localhost] => {
"msg": "It's hard to here"
} PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
也可以写成下面的形式来保证
task的返回值为0:- hosts: localhost
tasks:
- name: Igonre False
shell: /bin/false || /bin/ture - name: Print Message
debug:
msg: "It's hard to here"
1.2 task执行失败强制调用handlers
通常情况下,当 task 失败后, playbook 将会终止,任何在前面已经被 tasks notify 的 handlers 都不会被执行。如果你在 playbook 中设置了 force_handlers: yes 参数,被通知的 handlers 就会被强制执行。
请看下面的
playbook:[root@xuzhichao playbook]# cat force_handlers.yml
- hosts: localhost tasks:
- name: Copy Configure File
template:
src: conf/nginx.conf.j2
dest: /tmp/nginx.conf
notify: Start Nginx - name: Igonre False
shell: /bin/false handlers:
- name: Start Nginx
service:
name: nginx
state: started
当
conf/nginx.conf.j2文件发生改变时,由于在Igonre False这个task中执行出现错误,将不会执行handlers中的内容。[root@xuzhichao playbook]# ansible-playbook force_handlers.yml PLAY [localhost] ********************************************************************************************************************************************** TASK [Copy Configure File] ************************************************************************************************************************************
ok: [localhost] TASK [Igonre False] *******************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "/bin/false", "delta": "0:00:00.006289", "end": "2021-08-05 22:09:40.799988", "msg": "non-zero return code", "rc": 1, "start": "2021-08-05 22:09:40.793699", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []} PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
若此时需要强制执行
handlers中的内容,需要使用force_handlers: yes参数,playbook修改如下:[root@xuzhichao playbook]# cat force_handlers.yml
- hosts: localhost
force_handlers: yes tasks:
- name: Copy Configure File
template:
src: conf/nginx.conf.j2
dest: /tmp/nginx.conf
notify: Start Nginx - name: Igonre False
shell: /bin/false handlers:
- name: Start Nginx
service:
name: nginx
state: started
此时运行
playbook,当conf/nginx.conf.j2文件发生改变时,handlers将会被强制执行:[root@xuzhichao playbook]# ansible-playbook force_handlers.yml PLAY [localhost] ********************************************************************************************************************************************** TASK [Copy Configure File] ************************************************************************************************************************************
changed: [localhost] TASK [Igonre False] *******************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "/bin/false", "delta": "0:00:00.003843", "end": "2021-08-05 22:12:00.335807", "msg": "non-zero return code", "rc": 1, "start": "2021-08-05 22:12:00.331964", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []} RUNNING HANDLER [Start Nginx] *********************************************************************************************************************************
ok: [localhost] PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
1.3 控制Tasks报告状态为OK
有时一些task会在每次playbook运行是都会执行一次,这样会导致playbook的运行结果中该task会显示为changed状态,但是有时这些task并没有改变被控端的状态,仅仅是获取了某些信息,此时可以使用changed_when: false 来抑制这个状态。
请看下面示例:
playbook文件内容如下:
[root@xuzhichao playbook]# cat status_ok.yml
- hosts: localhost
tasks:
- name: Get Nginx Server Port
shell: netstat -ntlp | grep nginx
register: nginx_port - name: Print Nginx Port
debug:
msg:
- "{{ nginx_port.stdout_lines }}"
每次的执行结果“Get Nginx Server Port”任务状态都是changed:
[root@xuzhichao playbook]# ansible-playbook status_ok.yml PLAY [localhost] ********************************************************************************************************************************************** TASK [Get Nginx Server Port] **********************************************************************************************************************************
changed: [localhost] <==状态为changed TASK [Print Nginx Port] ***************************************************************************************************************************************
ok: [localhost] => {
"msg": [
[
"tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26579/nginx: master "
]
]
} PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
可以使用changed_when: false 来抑制这个状态,playbook修改如下:
[root@xuzhichao playbook]# cat status_ok.yml
- hosts: localhost
tasks:
- name: Get Nginx Server Port
shell: netstat -ntlp | grep nginx
register: nginx_port
changed_when: false <==该task不再发生changed提示 - name: Print Nginx Port
debug:
msg:
- "{{ nginx_port.stdout_lines }}"
此时执行结果如下:
[root@xuzhichao playbook]# ansible-playbook status_ok.yml PLAY [localhost] ********************************************************************************************************************************************** TASK [Get Nginx Server Port] **********************************************************************************************************************************
ok: [localhost] <==变为OK状态 TASK [Print Nginx Port] ***************************************************************************************************************************************
ok: [localhost] => {
"msg": [
[
"tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26579/nginx: master "
]
]
} PLAY RECAP ****************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.4 changed_when检查任务结果
仍然以安装httpd为例,在每次修改完httpd的配置文件后,都需要检查配置文件的语法是否正确,如果不正确,则退出后续task,不重启httpd服务。
playbook文件优化如下:[root@xuzhichao playbook]# cat change_when.yml
---
- hosts: 192.168.20.23
remote_user: root tasks:
- name: Install Htttpd Server
yum:
name: httpd
state: present
tags:
- install_httpd
- install_apache - name: Configure Httpd Server
copy:
src: conf/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
owner: "root"
group: "root"
mode: "0644"
notify: Restart Httpd Server
tags: conf_httpd - name: Check Httpd Configuer <==检测配置文件语法
shell: /usr/sbin/httpd -t
register: httpd_check
changed_when:
- httpd_check.stdout.find('OK') <==查找变量返回的结果是否有ok,如不存在则终止该tasks
- false <==被管理主机没有发生变化状态则为OK - name: Init Httpd Server
copy:
src: file/test.html.j2
dest: /var/www/html/test.html
owner: "apache"
group: "apache"
mode: "0644"
tags: init_httpd - name: Start Httpd Server
service:
name: httpd
state: started
enabled: yes
tags: start_httpd handlers:
- name: Restart Httpd Server
service:
name: httpd
state: restarted
tags: restart httpd [root@nginx03 ~]# httpd -t
Syntax OK
playbook运行结果如下:[root@xuzhichao playbook]# ansible-playbook change_when.yml PLAY [192.168.20.23] ****************************************************************************************************************************************** TASK [Install Htttpd Server] **********************************************************************************************************************************
ok: [192.168.20.23] TASK [Configure Httpd Server] *********************************************************************************************************************************
ok: [192.168.20.23] TASK [Check Httpd Configuer] **********************************************************************************************************************************
ok: [192.168.20.23] TASK [Init Httpd Server] **************************************************************************************************************************************
ok: [192.168.20.23] TASK [Start Httpd Server] *************************************************************************************************************************************
changed: [192.168.20.23] PLAY RECAP ****************************************************************************************************************************************************
192.168.20.23 : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible系列(28)--ansible的playbook异常处理的更多相关文章
- Ansible系列(五):playbook应用和roles自动化批量安装示例
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- Ansible系列(三):YAML语法和playbook写法
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- Ansible系列(四):playbook应用和roles自动化批量安装示例
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html playbook是ansible实现批量自动化最重要的手段.在其中可以使用变 ...
- Ansible系列(二):选项和常用模块
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- Ansible系列(一):基本配置和使用
本文目录:1.1 安装Ansible1.2 配置Ansible 1.2.1 环境配置 1.2.2 SSH互信配置 1.2.3 简单测试1.3 inventory Ansible是一种批量.自动部署工具 ...
- Ansible系列(六):各种变量定义方式和变量引用
本文目录:1.1 ansible facts1.2 变量引用json数据的方式 1.2.1 引用json字典数据的方式 1.2.2 引用json数组数据的方式 1.2.3 引用facts数据1.3 设 ...
- Ansible系列(六):循环和条件判断
本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...
- Ansible系列(七):执行过程分析、异步模式和速度优化
本文目录:1.1 ansible执行过程分析1.2 ansible并发和异步1.3 ansible的-t选项妙用1.4 优化ansible速度 1.4.1 设置ansible开启ssh长连接 1.4. ...
- ansible学习笔记三:playbook和roles
参考博客: Ansible 系列之 Playbooks 剧本 -飞走不可(博客园) linux运维学习之ansible的playbook及roles的使用 - 51CTO博客 nginx 基于uwsg ...
- Ansible系列(五):各种变量定义方式和变量引用
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.1 ansible facts facts组件是用来收集被管理节点信息的 ...
随机推荐
- UE4蓝图对Actor的引用
通过关卡蓝图调用 在关卡中放置一个Actor,在关卡蓝图中右键 create a reference to actor,即可 注意使用该方法创建时,需要现在关卡中选择上该类Actor 当Actor生成 ...
- Final Countdown 题解
Problem Link 简要题意 把一个数不断减一直到变成零,每个数位变化一次需要一秒. 比如 \(300\) 变成 \(299\) 需要 \(3\) 秒. 求把一个数变成零要多少秒. 思路 对于每 ...
- #CDQ分治,单调栈,双指针#BZOJ 4237 稻草人 AT1225 かかし
洛谷传送门 BZOJ 4237 稻草人 题意 在一个平面直角坐标系上给出\(n\)个点, 问有多少个点对\((i,j)\)满足\(x_i<x_j,y_i<y_j\), 而且对于\(n\)个 ...
- #KD-Tree#洛谷 4849 寻找宝藏
题目传送门 题目大意 在一个四维坐标系中,给定 \(n\) 个点,问有多少种选择点的方案, 使得这些点排序后任意坐标单调不降,并且选择的点权和最大,同时输出最大值 分析 设 \(f[i]\) 表示最后 ...
- #树状数组、dp#JZOJ 5361 捕老鼠
题目 农夫约的农庄里有\(N\)个仓库,排成了一排,编号为\(1-N\). 假设猫在第\(i\)个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散\(Ai\)的距离,接着所有\(|i-j|<=Ai ...
- DevEco Studio的这些预览能力你都知道吗?
在万物互联的今天,开发者在应用/服务开发过程中,需要考虑应用/服务在不同设备上的运行效果.为满足这一需求,DevEco Studio 作为 HarmonyOS 和 OpenAtom OpenHarmo ...
- SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤
SQL CREATE INDEX 语句 SQL CREATE INDEX 语句用于在表中创建索引. 索引用于比其他方式更快地从数据库中检索数据.用户无法看到索引,它们只是用于加速搜索/查询. 注意: ...
- Numpy数组拼接和分裂
将多个数组合并成一个,或将一个数组分裂成多个. 数组拼接 concatenate([a1, a2, ...], axis=0, out=None) #默认沿axis = 0轴拼接,也可设置沿axis ...
- MogDB 2.1.1 初始化参数概要说明
MogDB 2.1.1 初始化参数概要说明 本文出处:https://www.modb.pro/db/394787 MogDB 数据库安装完成后,官方文档提供了刷新参数的脚本,推荐执行脚本来进行初始化 ...
- Python根据主播直播时间段判定订单销售额归属
写在前面:最近在群里看到一个这样的直播电商的场景觉得还是挺有趣的,于是就想用Python来实现. 需求描述:根据主播直播时间段结合销售订单的付款时间判断所属销售的归属 生成主播在线直播时间段数据 fr ...