当前位置: 首页 > news >正文

Ansible的错误处理

环境

  • 管理节点:Ubuntu 22.04
  • 控制节点:CentOS 8
  • Ansible:2.15.6

ignore_errors

使用 ignore_errors: true 来让Ansible忽略错误(运行结果是 failed ):

---
- hosts: alltasks:- name: task1shell: cat /tmp/abc.txtignore_errors: true- name: task2debug:msg: "hello"

运行结果如下:

TASK [task1] ***************************************************************************************
fatal: [192.168.1.55]: FAILED! => {"changed": true, "cmd": "cat /tmp/abc.txt", "delta": "0:00:00.002192", "end": "2023-11-25 16:53:58.063148", "msg": "non-zero return code", "rc": 1, "start": "2023-11-25 16:53:58.060956", "stderr": "cat: /tmp/abc.txt: No such file or directory", "stderr_lines": ["cat: /tmp/abc.txt: No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoringTASK [task2] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "hello"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1  

ignore_unreachable

如果目标节点无法访问(比如编辑 /etc/ansible/hosts ):

---
- hosts: allgather_facts: false # 避免在这里出错tasks:- name: task1shell: cat /tmp/abc.txtignore_errors: true- name: task2debug:msg: "hello"

运行结果如下:

TASK [task1] ***************************************************************************************
fatal: [192.168.1.56]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.56 port 22: No route to host", "unreachable": true}PLAY RECAP *****************************************************************************************
192.168.1.56               : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   

可见,本例中 ignore_errors: true 并不起作用,这是因为运行结果是 unreachable ,不是 failedignore_errors: true 只针对 failed 有效。

要想忽略 unreachable 错误,则需要 ignore_unreachable: true

---
- hosts: allgather_facts: falsetasks:- name: task1shell: cat /tmp/abc.txtignore_unreachable: true- name: task2debug:msg: "hello"

运行结果如下:

TASK [task1] ***************************************************************************************
fatal: [192.168.1.56]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.56 port 22: No route to host", "unreachable": true}
...ignoringTASK [task2] ***************************************************************************************
ok: [192.168.1.56] => {"msg": "hello"
}PLAY RECAP *****************************************************************************************
192.168.1.56               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1 

可见, ignore_unreachable: true 可忽略 unreachable 错误。

注意: debug 运行在控制节点,不需要访问目标节点。

---
- hosts: allgather_facts: falsetasks:- name: task1shell: cat /tmp/abc.txtignore_unreachable: true- name: task2shell: cat /tmp/def.txt

运行结果如下:

TASK [task1] ***************************************************************************************
fatal: [192.168.1.56]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.56 port 22: No route to host", "unreachable": true}
...ignoringTASK [task2] ***************************************************************************************
fatal: [192.168.1.56]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.56 port 22: No route to host", "unreachable": true}PLAY RECAP *****************************************************************************************
192.168.1.56               : ok=1    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=1

可见, ignore_unreachable: true 只针对当前范围有效。

所以,应把 ignore_unreachable: true 提高一层:

---
- hosts: allgather_facts: falseignore_unreachable: truetasks:- name: task1shell: cat /tmp/abc.txt- name: task2shell: cat /tmp/def.txt

运行结果如下:

TASK [task1] ***************************************************************************************
fatal: [192.168.1.56]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.56 port 22: No route to host", "unreachable": true}
...ignoringTASK [task2] ***************************************************************************************
fatal: [192.168.1.56]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.56 port 22: No route to host", "unreachable": true}
...ignoringPLAY RECAP *****************************************************************************************
192.168.1.56               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=2   

force_handlers

我们知道,handler是在所有task都运行结束后才运行的。假设task1触发了handler1,但接下来task2出错了,则handler无法运行。

---
- hosts: all#force_handlers: Truetasks:- name: task1shell: cat /tmp/a.txtnotify: handler1- name: task2shell: cat /tmp/abc.txthandlers:- name: handler1debug:msg: "OK"

运行结果如下:

TASK [task1] ***************************************************************************************
changed: [192.168.1.55]TASK [task2] ***************************************************************************************
fatal: [192.168.1.55]: FAILED! => {"changed": true, "cmd": "cat /tmp/abc.txt", "delta": "0:00:00.003114", "end": "2023-11-25 17:29:23.501341", "msg": "non-zero return code", "rc": 1, "start": "2023-11-25 17:29:23.498227", "stderr": "cat: /tmp/abc.txt: No such file or directory", "stderr_lines": ["cat: /tmp/abc.txt: No such file or directory"], "stdout": "", "stdout_lines": []}

可见,handler并未运行。

通过指定 force_handlers: True ,可以强制handler运行。

添加 force_handlers: True (见注释部分),则运行结果如下:

TASK [task1] ***************************************************************************************
changed: [192.168.1.55]TASK [task2] ***************************************************************************************
fatal: [192.168.1.55]: FAILED! => {"changed": true, "cmd": "cat /tmp/abc.txt", "delta": "0:00:00.002423", "end": "2023-11-25 17:30:09.107674", "msg": "non-zero return code", "rc": 1, "start": "2023-11-25 17:30:09.105251", "stderr": "cat: /tmp/abc.txt: No such file or directory", "stderr_lines": ["cat: /tmp/abc.txt: No such file or directory"], "stdout": "", "stdout_lines": []}RUNNING HANDLER [handler1] *************************************************************************
ok: [192.168.1.55] => {"msg": "OK"
}

注:也可以通过 meta: flush_handlers 使handler立即运行。

failed_when

可以自定义失败。具体方法为:先用register变量获取运行结果,然后再根据结果来做判断,比如:

---
- hosts: alltasks:- name: task1shell: cat /tmp/a.txtregister: resultfailed_when: "'OK' not in result.stdout"
  • 若目标机器的 /tmp/a.txt 文件里包含 OK 字样,则视为运行成功:
TASK [task1] ***************************************************************************************
changed: [192.168.1.55]PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 若目标机器的 /tmp/a.txt 文件里不包含 OK 字样,则视为运行失败:
TASK [task1] ***************************************************************************************
fatal: [192.168.1.55]: FAILED! => {"changed": true, "cmd": "cat /tmp/a.txt", "delta": "0:00:00.004289", "end": "2023-11-25 17:42:22.907553", "failed_when_result": true, "msg": "", "rc": 0, "start": "2023-11-25 17:42:22.903264", "stderr": "", "stderr_lines": [], "stdout": "aaaaa\nb\nccccc", "stdout_lines": ["aaaaa", "b", "ccccc"]}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0  

如果有多个判断条件,且它们之间是“与”的关系:

---
- hosts: alltasks:- name: task1shell: cat /tmp/a.txtregister: resultfailed_when:- "'OK' not in result.stdout"- "'SUCCESS' not in result.stdout"

如果目标机器的 /tmp/a.txt 文件里不包含 OK 字样,且不包含 SUCCESS 字样,则视为运行失败。

当然,也可以用 failed_when: xxxxx and xxxxx

同理,若多个条件之间是“或”的关系,则是: failed_when: xxxxx or xxxxx

注:如果语句太长,可以用 > 换行(这是yaml的语法):

---
- hosts: alltasks:- name: task1shell: cat /tmp/a.txtregister: resultfailed_when: >'OK' not in result.stdout or'SUCCESS' not in result.stdout

changed_when

failed_when 类似,可通过 changed_when 来自定义结果发生变化的条件。比如,我们知道handler只有当运行结果发生变化时,才会被触发。此时自定义结果发生变化的条件就尤为有用。

---
- hosts: alltasks:- name: task1shell: cat /tmp/a.txtregister: resultchanged_when: >'OK' in result.stdout or'SUCCESS' in result.stdoutnotify: handler1handlers:- name: handler1debug:msg: "The result is OK"

本例中,当目标机器的 /tmp/a.txt 文件里包含 OKSUCCESS 字样时,就会触发handler1。

强制shell/command运行成功

假设目标机器上 /tmp/b.sh 内容如下:

#!/bin/bashecho "bad"exit 1

该脚本运行结果的返回值不是0,则Ansible会视为失败。如果想视为成功,一个办法是 ignore_errors: true ,还有一个办法是让shell返回0,比如:

---
- hosts: alltasks:- name: task1shell: /tmp/b.sh || /bin/true

注: /tmp/b.sh || /bin/true 是一个整体,其中 /bin/true 是系统自带的脚本,返回0。

➜  ~ /tmp/b.sh || /bin/true
bad➜  ~ echo $?
0

参考

  • https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_error_handling.html

相关文章:

Ansible的错误处理

环境 管理节点:Ubuntu 22.04控制节点:CentOS 8Ansible:2.15.6 ignore_errors 使用 ignore_errors: true 来让Ansible忽略错误(运行结果是 failed ): --- - hosts: alltasks:- name: task1shell: cat /t…...

MySQL-04-InnoDB存储引擎锁和加锁分析

Latch一般称为闩锁(轻量级锁),因为其要求锁定的时间必须非常短。在InnoDB存储引擎中,latch又分为mutex(互斥量)和rwlock(读写锁)。 Lock的对象是事务,用来锁定的是…...

tcp/ip协议2实现的插图,数据结构2 (19 - 章)

(68) 68 十九1 选路请求与消息 函rtalloc,rtalloc1,rtfree (69) 69 十九2 选路请求与消息 函rtrequest (70)...

2023.11.22 -数据仓库的概念和发展

目录 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1经典传统数仓架构 2离线大数据数仓架构 3数据仓库三层 数据运营层,源数据层(ODS)(Operational Data Store) 数据仓库层&#…...

java springboot测试类虚拟MVC环境 匹配请求头指定key与预期值是否相同

上文 java springboot测试类虚拟MVC环境 匹配返回值与预期内容是否相同 (JSON数据格式) 版 中 我们展示 json匹配内容的方式 那么 本文我们来看看Content-Type属性的匹配方式 首先 我们从返回体可以看出 Content-Type 在请求头信息 Headers 中 我们直接将测试类代码更改如下 …...

Rust生态系统:探索常用的库和框架

大家好!我是lincyang。 今天我们来探索Rust的生态系统,特别是其中的一些常用库和框架。 Rust生态系统虽然相比于一些更成熟的语言还在成长阶段,但已经有很多强大的工具和库支持各种应用的开发。 常用的Rust库和框架 Serde:一个…...

01-了解微服务架构的演变过程和微服务技术栈

微服务 微服务架构演变 单体架构:将业务的所有功能集中在一个项目中开发最后打成一个包部署 优点: 架构简单, 部署成本低,适合小型项目缺点: 耦合度高, 升级维护困难 分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发称为一个服务 优点: 降低服务耦合…...

阿里入局鸿蒙!鸿蒙原生应用再添两员新丁

今日HarmonyOS微博称,阿里钉钉、蚂蚁集团旗下的移动开发平台mPaaS与华为达成合作,宣布启动鸿蒙原生应用的开发!相关应用将以原生方式适配#HarmonyOS NEXT#系统。 #HarmonyOS#市场或迎来爆发式增长! 阿里钉钉 阿里钉钉与华为达成合…...

亚马逊运营中动态/静态住宅IP代理的应用有哪些?

作为全球最大的电商平台之一,亚马逊已经成为许多商家的首选销售平台。而代理IP作为近几天互联网的热门工具,在跨境电商界也起着非常强大的作用。那么在亚马逊运营中,适合动态住宅代理还是静态住宅代理呢?下面我们一起来探索&#…...

redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】

redis数据结构介绍 redis是一个key-value的数据库,key一般是String类型,但是value的类型多种多样。 redis 通用命令 keys : 查看符合模板的所有key (keys partten ,匹配表达式支持一些特殊字符 * ?)del:删…...

Ubuntu 22.04.3编译AOSP13刷机

文章目录 设备信息下载AOSP并切换分支获取设备驱动编译系统编译遇到的问题Cannot allocate memoryUbuntu设置USB调试刷机参考链接 设备信息 手机:Pixel 4XL 下载AOSP并切换分支 在清华大学开源软件镜像站下载初始化包aosp-latest.tar。 解压缩,切换到…...

Navicat 技术指引 | 适用于 GaussDB 的数据迁移工具

Navicat Premium(16.2.8 Windows版或以上) 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…...

算法基础之表达式求值

算法基础之表达式求值 中序表达式求值 用栈 将字符和数字分别用栈存储 由下往上计算 左子树算完再算右子树 判断方法&#xff1a;当前符号优先级<前一个符号优先级 则左右子树已遍历完 #include<iostream>#include<cstring>#include<stack>#include&l…...

【matlab程序】图像最大化填充画布

【matlab程序】图像最大化填充画布 不做任何修饰&#xff1a; 修饰&#xff1a; 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Pytho…...

C3 多媒体查询

文章目录 前言CSS3 多媒体查询CSS2 多媒体类型CSS3 多媒体查询浏览器支持多媒体查询语法CSS3 多媒体类型多媒体查询简单实例 媒体类型媒体功能更多实例后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;CSS &#x1f431;‍&#x1f453;博…...

网站监控是什么

在当今高度互联的世界中&#xff0c;网站已成为企业和个人成功的关键因素。无论是提供产品或服务&#xff0c;还是建立品牌形象&#xff0c;网站都是不可或缺的工具。然而&#xff0c;随着互联网用户对访问速度和用户体验的高要求&#xff0c;保持网站的稳定性和可用性变得至关…...

基于DCT变换的图像压缩解压缩算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DCT变换原理 4.2、基于DCT的图像压缩 4.3、基于DCT的图像解压缩 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ...................…...

基于单片机压力传感器MPX4115检测-报警系统proteus仿真+源程序

一、系统方案 1、本设计采用这51单片机作为主控器。 2、MPX4115采集压力值、DS18B20采集温度值送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /*********************************…...

3.读取字符串【2023.11.25】

1.问题描述 请使用 input 函数读取一串字符串&#xff0c;然后将其输出。 2.解决思路 输入一行字符串。 将读入的变量输出。 3.代码实现 strinput("请输入一个字符串") print(str)4.运行结果...

C/C++ 通过SQLiteSDK增删改查

SQLite&#xff0c;作为一款嵌入式关系型数据库管理系统&#xff0c;一直以其轻量级、零配置以及跨平台等特性而备受青睐。不同于传统的数据库系统&#xff0c;SQLite是一个库&#xff0c;直接与应用程序一同编译和链接&#xff0c;无需单独的数据库服务器进程&#xff0c;实现…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...