Ansible任务控制loop循环、when和block条件判断介绍演示

目录

一.循环迭代(loop/with_items)

1.作用

2.案例演示

(1)遍历输出以列表形式定义的abc

(2)遍历输出以变量定义的webservers组内主机

(3)遍历输出以字典定义的数据

(4)遍历嵌套定义的loop

二.条件判断(when)

1.作用

2.when语句的比较运算符

(1)!=/==用于比较两个对象是否不等/相等,可用于字符串、数字类型

(2)>/<,>=/<=用于比较两个对象的大小

3.when语句的逻辑运算符

(1)and,逻辑与,两个对象同真为真

(2)or,逻辑或,两个对象见真为真

(3)not,逻辑否,取反

(4)(),作为一个更大的表达式包含一组表达式

4.when语句的exists判断

(1)判断目录是否存在

(2)判断文件是否不存在,取反操作

5.when语句对于变量的判断

(1)defined,变量已被定义

(2)变量未被定义

(3)变量被定义为空

6.when语句对于结果的判断

(1)success/succeeded,failure/failed判断任务任性成功与否

(2)change/changed,skip/skipped判断任务执行状态

三.整体条件判断block

1.作用

2.block用法示例

3.block错误处理时用法演示

4.block固定执行用法演示


一.循环迭代(loop/with_items)

1.作用

主要是用于让管理节点在需要编写多个任务时的情况下仅用一个任务来进行循环迭代完成任务,使用loop关键字对目标进行迭代,在ansible相对比较旧的版本中使用的with_item平替,现在我的2.9.27仍然兼容,loop关键字内可以是列表、变量、字典等

2.案例演示

(1)遍历输出以列表形式定义的abc

[root@main playkongzhi]# cat loop1.yaml 
---
- hosts: serveratasks:- name: test itemdebug: msg: "{{ item }}"loop:- 'a'- 'b'- 'c'[root@main playkongzhi]# ansible-playbook loop1.yaml
ok: [servera] => (item=a) => {"msg": "a"
}
ok: [servera] => (item=b) => {"msg": "b"
}
ok: [servera] => (item=c) => {"msg": "c"
}

(2)遍历输出以变量定义的webservers组内主机

[root@main playkongzhi]# cat loop1.yaml 
---
- hosts: serveratasks:- name: test itemdebug: msg: "{{ item }}"loop: "{{ groups.webservers }}"[root@main playkongzhi]# ansible-playbook loop1.yaml
ok: [servera] => (item=servera) => {"msg": "servera"
}
ok: [servera] => (item=serverb) => {"msg": "serverb"
}

(3)遍历输出以字典定义的数据

循环输出hello和nihao

[root@main playkongzhi]# cat loop1.yaml 
---
- hosts: serveratasks:- name: test itemdebug: msg: "{{ item }}"loop:- x1: 'hello'- x2: 'nihao'
[root@main playkongzhi]# ansible-playbook loop1.yaml
ok: [servera] => (item={u'x1': u'hello'}) => {"msg": {"x1": "hello"}
}
ok: [servera] => (item={u'x2': u'nihao'}) => {"msg": {"x2": "nihao"}
}

(4)遍历嵌套定义的loop

循环创建user1和user2

[root@main playkongzhi]# cat loopuser.yaml 
---
- hosts: serveratasks:- name: create user1 and user2user:name: "{{ item.name }}"state: presentuid: "{{ item.uid }}"loop:- name: user1uid: 1011- name: user2uid: 1012
[root@main playkongzhi]# ansible servera -a 'id user1'
servera | CHANGED | rc=0 >>
uid=1011(user1) gid=1011(user1) groups=1011(user1)
[root@main playkongzhi]# ansible servera -a 'id user2'
servera | CHANGED | rc=0 >>
uid=1012(user2) gid=1012(user2) groups=1012(user2)

二.条件判断(when)

1.作用

(1)条件判断用于此任务的结果依赖变量、fact或者是上一个任务的结果,用条件判断就可以决定如何去执行对应的任务。在节点上建立了限制,捕获那些命令的输出,结果不同,执行的任务要求不同。

(2)可以判断某服务的配置文件是否发生变动时考虑是否重启。

(3)可以根据cpu状况来定制合适的调优策略

2.when语句的比较运算符

(1)!=/==用于比较两个对象是否不等/相等,可用于字符串、数字类型

示例

[root@main playkongzhi]# cat bijiao.yaml 
---
- hosts: serveratasks:- name: com themdebug:msg: '等于'when: name == ownervars:name: sulibaoowner: sulibao
​
ok: [servera] => {"msg": "等于"
}

(2)>/<,>=/<=用于比较两个对象的大小

示例

[root@main playkongzhi]# cat bijiao.yaml 
---
- hosts: serveratasks:- name: com themdebug:msg: 'hello'when: name >= ownervars:name: sulowner: liok: [servera] => {"msg": "hello"
}

3.when语句的逻辑运算符

(1)and,逻辑与,两个对象同真为真

[root@main playkongzhi]# cat when.yaml 
---
- hosts: serveratasks:- name: dis infodebug:msg: "yes"when: 1 > 0 and 1 < 9ok: [servera] => {"msg": "yes"
}

(2)or,逻辑或,两个对象见真为真

[root@main playkongzhi]# cat when.yaml 
---
- hosts: serveratasks:- name: dis infodebug:msg: "yes"when: 1 > 0 or 1 < 9
​
ok: [servera] => {"msg": "yes"
}

(3)not,逻辑否,取反

[root@main playkongzhi]# cat when.yaml 
---
- hosts: serveratasks:- name: dis infodebug:msg: "yes"when: not 1 > 0 and 1 < 9
​
skipping: [servera]

(4)(),作为一个更大的表达式包含一组表达式

[root@main playkongzhi]# cat when.yaml 
---
- hosts: serveratasks:- name: dis infodebug:msg: "yes"when: (not 1 > 0 and 1 < 9) or 5 < 6ok: [servera] => {"msg": "yes"
}

4.when语句的exists判断

(1)判断目录是否存在

[root@main playkongzhi]# cat test.yaml 
---
- hosts: serveratasks:- debug:msg: "directory exist"when: path is existsvars:path: /rootok: [servera] => {"msg": "directory exist"
}

(2)判断文件是否不存在,取反操作

[root@main playkongzhi]# cat test.yaml 
---
- hosts: serveratasks:- debug:msg: "file not exist"when: not path is existsvars:path: /root/ansible.bakok: [servera] => {"msg": "file not exist"
}

5.when语句对于变量的判断

(1)defined,变量已被定义

[root@main playkongzhi]# cat varswhen.yaml 
---
- hosts: serveratasks:- name: test varsdebug:msg: "var defined"when: inventory_hostname is defined
​
ok: [servera] => {"msg": "var defined"
}

(2)变量未被定义

[root@main playkongzhi]# cat varswhen.yaml 
---
- hosts: serveratasks:- name: test varsdebug:msg: "var undefined"when: a is undefined
​
ok: [servera] => {"msg": "var undefined"
}

(3)变量被定义为空

[root@main playkongzhi]# cat varswhen.yaml 
---
- hosts: serveravars:a:tasks:- name: test varsdebug:msg: "var none"when: a is noneok: [servera] => {"msg": "var none"
}

6.when语句对于结果的判断

(1)success/succeeded,failure/failed判断任务任性成功与否

[root@main playkongzhi]# cat result.yaml 
---
- hosts: serveratasks:- name: cd resultshell: "cd /cevd"ignore_errors: true   #为了测试结果完整,忽略错误register: result- name: test resultdebug:msg: "no directory /cevd"when: not result is success
​
ok: [servera] => {"msg": "no directory /cevd"
}

(2)change/changed,skip/skipped判断任务执行状态

[root@main playkongzhi]# cat result.yaml 
---
- hosts: serveratasks:- name: cd resultshell: "touch /a.txt"ignore_errors: trueregister: result- name: test resultdebug:msg: "touch success"when: result is changed
​
ok: [servera] => {"msg": "touch success"
}

三.整体条件判断block

1.作用

解决when语句多个判断需要书写多个when的情况,使用block将多个任务组合起来,对这个整体进行when条件判断,条件成立了才会去执行块中的所有任务。在playbook中可以给block定义name,也可以直接使用when,但不能直接对其使用loop循环。这里主要介绍block常规用法,rescue错误处理用法和always固定执行用法

2.block用法示例

[root@main playkongzhi]# cat block.yaml 
---
- hosts: serveratasks:- name: carry blockblock:- name: free shell: "free -m"- name: echo shell: "free -m > /a.txt"when: 1 < 2
​
[root@main playkongzhi]# ansible servera -a 'cat /a.txt'
servera | CHANGED | rc=0 >>total        used        free      shared  buff/cache   available
Mem:           5848         306        5348          11         193        5313
Swap:          2047           0        2047

3.block错误处理时用法演示

没有/my目录,shell模块执行错误,执行rescue部分

注意:block模块中只要有一个任务执行失败都会跳转执行rescue部分

[root@main playkongzhi]# cat rescue.yaml 
---
- hosts: serveratasks:- name: test rescueblock:- shell: "ls /my"rescue:- debug: msg: "no directory"
​
ok: [servera] => {"msg": "no directory"
}

4.block固定执行用法演示

不管bloack块执行成功还是失败,都执行alway部分

[root@main playkongzhi]# cat always.yaml 
---
- hosts: serveratasks:- name: test rescueblock:- shell: "ls /my"rescue:- debug: msg: "no directory"always:- debug:msg: "there always"
​
ok: [servera] => {"msg": "no directory"
}
​
ok: [servera] => {"msg": "there always"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/117709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3 学习记录 字符串处理

目录 1&#xff0c; f 字符串格式 用法 常见数字格式化 结合进制的数字格式化 总结 2&#xff0c;格式化处理 大小写 输出 3, python3 去除空格处理&#xff1a; 4 、python3 字符串截取 (切片) 5、字符串的搜索 6、 字符串填充或者剔除某些信息 7、 字符串的分割与…

openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户

文章目录 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户108.1 创建、修改和删除用户108.2 私有用户108.3 永久用户108.4 用户认证优先规则 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户 使用CREATE USER和ALTER USER可以创建和管理数据…

阿里DataWorks的数据服务进行模糊查询

数据源为hologres { "apiLog": null, "data": null, "errCode": 1108110622, "errMsg": "数据源查询失败:[PreparedStatementCallback; SQL [xxxx]; 栏位索引超过许可范围&#xff1a;21&#xff0c;栏位数&#xff1a;20。; ne…

48.Redis缓存设计与性能优化

缓存穿透 请求都跑到存储层&#xff0c;失去了缓存包含存储的意义。 造成的原因 自身业务代码或者数据出现问题一些恶意攻击、 爬虫等造成大量空命中 解决方案 缓存空对象布隆过滤器 布隆过滤器不能删除数据&#xff0c;如果要删除得重新初始化数据。 缓存失效(击穿) 由…

百度文心一言4.0——使用及API测试

登录百度智能云&#xff1a;百度智能云 文心一言4.0使用 开通付费&#xff1a; 创建应用&#xff1a; 自行创建应用名称&#xff1a; 对话测试&#xff1a; API测试 ERNIE-Bot-4 API&#xff1a;ERNIE-Bot-4 打开链接查看自己的API Key&#xff0c;Secret Key。 可参…

高速下载b站视频的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

JavaWeb——Servlet原理、生命周期、IDEA中实现一个Servlet(全过程)

6、servlet 6.1、什么是servlet 在JavaWeb中&#xff0c;Servlet是基于Java编写的服务器端组件&#xff0c;用于处理客户端&#xff08;通常是Web浏览器&#xff09;发送的HTTP请求并生成相应的HTTP响应。Servlet运行在Web服务器上&#xff0c;与Web容器&#xff08;如Tomcat&…

如何平衡 Wi-Fi 7 与未来 5G/6G 的发展?

随着社会进步&#xff0c;人们对信息技术的需求不断提升。当前互联网、大数据、云计算、人工智能、区块链等新技术深刻演变&#xff0c;产业数字化、智能化、绿色化转型不断加速&#xff0c;智能产业、数字经济蓬勃发展&#xff0c;极大改变全球要素资源配置方式、产业发展模式…

Auth.js:多合一身份验证解决方案 | 开源日报 No.60

nodejs/node Stars: 96.2k License: NOASSERTION Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。它具有以下关键特性和核心优势&#xff1a; 强大&#xff1a;Node.js 提供了强大且高效的服务器端运行能力&#xff0c;可以处理并发请求&#xff0c;并支持异步编程…

深度学习--通过对Keras进行微调提升性能

本文使用微调(Fine-tune)技术来提升模型的性能。前面我们通过迁移学习将这个猫狗大战二分类问题的预测准确率提升到了90%左右,看上去效果已经很不错了,但是还能不能进一步提升了呢? 前面我们没有对VGG16的卷积层进行参数的优化,那么我们这里就可以来优化这部分的参数。由…

京东(天猫)数据分析:2023下半年茶饮料市场高速增长,东方树叶一骑绝尘

当前在食品饮料行业中&#xff0c;整体的增长放缓&#xff0c;且各个细分品类上都已经充分竞争。但茶饮料市场例外&#xff0c;近两年呈现高增长的态势&#xff0c;一来取决于行业头部企业也在积极推动茶饮料不断升级&#xff0c;另外是主打更健康、更时尚的茶饮料深受年轻消费…

分代ZGC详解

ZGC&#xff08;Z Garbage Collector&#xff09;是Java平台上的一种垃圾收集器&#xff0c;它是由Oracle开发的&#xff0c;旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器&#xff0c;它主要针对具有大内存需求和低停顿时间要求的应用程序 分代ZGC收集器…

【分布式】: 幂等性和实现方式

【分布式】: 幂等性和实现方式 幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c; 常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数&#xff0c;或幂等方法&#xff0c;是…

docker搭建waline评论系统

我这里是给博客网站嵌入评论系统的 1.登录LeanCloud 国际版&#xff0c;没有账号可以注册个 链接&#xff1a;点击跳转 2.新建应用&#xff0c;选择开发版&#xff08;免费&#xff09;&#xff0c;商用版每个月最低消费5美刀。 3.在设置-应用凭证里面将AppID、AppKey、Maste…

如何制定关于AI伦理的国际标准?

制定关于AI伦理的国际标准是一个复杂而关键的任务&#xff0c;因为人工智能&#xff08;AI&#xff09;技术的快速发展带来了一系列伦理和社会挑战。这些挑战包括隐私问题、自主权问题、公平性问题、透明度问题、负面影响问题等。国际标准可以提供全球范围内的指导&#xff0c;…

PHP MySQL 交互 笔记/练习

PHP 与 MySQL 交互 交互函数 函数名作用mysqli_connect()与MySQL 数据库建立连接。mysqli_close()关闭与MYSQL 数据库建立的连接。mysqli_connect_errno()与MySQL 数据库建立连接时&#xff0c;发生错误时的错误编号。mysqli_connect_error()与MySQL 数据库建立连接时&#x…

Spark_SQL-DataFrame数据写出以及读写数据库(以MySQl为例)

一、数据写出 &#xff08;1&#xff09;SparkSQL统一API写出DataFrame数据 统一API写法&#xff1a; 常见源写出&#xff1a; # cording:utf8from pyspark.sql import SparkSession from pyspark.sql.types import StructType, IntegerType, StringType import pyspark.sql.fu…

html 常见兼容性问题

目录 前言: 用法: 代码: 1. 盒模型差异: 2. 表格布局问题: 3. 浏览器前缀问题: 4. 字体渲染问题: 理解: 讨论: 前言: 在Web开发中&#xff0c;兼容性问题是常见的挑战之一。不同的浏览器和设备可能以不同的方式解释和呈现HTML&#xff0c;导致网页在某些环境下出现问题…

LabVIEW在 XY Graph中选择一组点

LabVIEW在 XY Graph中选择一组点 问题&#xff1a;有一个包含许多点的XY Graph&#xff0c;在程序开发中&#xff0c;对于显示XY Graph中的多个点&#xff0c;如何进行选取。最好能像图像处理中的ROI一样&#xff0c;并且它们的颜色可以更改&#xff0c;可以在其中选择一些ROI…