RHCE8 资料整理(十一)

RHCE8 资料整理

    • 第 32 章 控制语句
      • 32.1 判断语句 when
        • 32.1.1 when 判断中>、<、!=和==的使用
        • 32.1.2 when 判断中 in的用法
        • 32.1.3 when 判断中 is的用法
      • 32.2 判断语句 block-rescue
      • 32.3 循环语句

第 32 章 控制语句

一个play中可以包含多个task,如果不想所有的task全部执行,可以设置只有满足某个条件才执行这个task。本章主要介绍whenblock-rescue两种判断语句。

32.1 判断语句 when

when作为一个判断语句,出现在某个task下,格式,

tasks:
- name: xxx
  模块
  when: 条件

如果条件成立,则执行模块,否则不执行。

在when中引用变量时是不用加{{}}的

32.1.1 when 判断中>、<、!=和==的使用

when后面可以有多个判断条件,使用orand作为连接符

常见的判断符包括:

符号说明
==等于
!=不等于
>大于
=>大于等于
<小于
<=小于等于
[root@node-137 ansible]# cat when-1.yml
---
- hosts: db1
  tasks:
  - name: when test
    debug: msg="1<2"
    when: 1<2
  - name: when test2
    debug: msg="1>2"
    when: 1>2
  - debug: msg="1>2 or 2<3"
    when: 1>2 or 2<3
  - debug: msg="2>1 and 3>2"
    when: 2>1 and 3>2
  - debug: msg="centos:7"
    when: ansible_distribution_major_version=="7"
[root@node-137 ansible]# ansible-playbook when-1.yml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [when test] **********************************************************************************************************************
ok: [node-138] => {
    "msg": "1<2"
}

TASK [when test2] *********************************************************************************************************************
skipping: [node-138]

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "1>2 or 2<3"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "2>1 and 3>2"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "centos:7"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=5    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

当判断条件不成立,则会提示skipping

32.1.2 when 判断中 in的用法

在when语句中,除可以使用上面的大于、小于等判断方法外,还可以使用in,如下

value [not] in 列表

如果此值在这个列表中,则判断成立,否则不成立

[root@node-137 ansible]# cat when-3.yml
---
- hosts: db1
  gather_facts: false
  vars:
    list1: [1,2,3,4,5]
  tasks:
  - debug: msg="123"
    when: 1 in list1
  - debug: msg="not in"
    when: 6 not in list1
[root@node-137 ansible]# ansible-playbook when-3.yml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "123"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "not in"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
32.1.3 when 判断中 is的用法

is可以用于判断变量是否被定义,常见的判断包括以下3种:

  1. is defined,变量被定义
  2. is undefined,变量未被定义,等同于is not defined
  3. is noe,变量被定义了,但值为空
[root@node-137 ansible]# cat when-4.yml
---
- hosts: db1
  gather_facts: true
  vars:
    aa: 123
    dd:
  tasks:
  - debug: msg={{aa}}
    when: aa is defined
  - debug: msg="bb"
    when: bb is not defined
  - debug: msg="cc"
    when: cc is undefined
  - debug: msg="dd"
    when: dd is none
[root@node-137 ansible]# ansible-playbook when-4.yml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": 123
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "bb"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "cc"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "dd"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

判断文件的小练习

[root@node-137 ansible]# cat when-5.yml
---
- hosts: db1
  tasks:
  - name: run syscmd
    shell: "ls /aa.txt"
    register: aa
    ignore_errors: true
  - name: task2
    fail: msg="命令执行错误"
    when: aa.rc != 0
  - name: task3
    debug: msg="OK123"
[root@node-137 ansible]# ansible-playbook when-5.yml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [run syscmd] *********************************************************************************************************************
fatal: [node-138]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.037543", "end": "2023-12-20 21:02:05.426760", "msg": "non-zero return code", "rc": 2, "start": "2023-12-20 21:02:05.389217", "stderr": "ls: cannot access /aa.txt: No such file or directory", "stderr_lines": ["ls: cannot access /aa.txt: No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [task2] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"changed": false, "msg": "命令执行错误"}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=2    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=1

32.2 判断语句 block-rescue

对于when来说,只能做一个判断,成立就执行,不成立就不执行。blockrescue一般同用,类似于shell判断语句中的if-else,在block下面可以包含多个模块,来判断这多个模块是否执行成功。用法,

block:
- 模块1
- 模块2
- 模块3
rescue:
- 模块4
- 模块5

执行流程:

  • 首先执行task1block中的模块1,如果成功,则继续执行block中的模块2,如果block中所有模块均执行成功,则跳过rescue中的模块,进而执行task2中的模块
  • 当执行task1block中的某个模块失败,则执行rescue中的模块4,如果rescue中的所有模块均执行成功,则继续执行task2中的模块,如果rescue中的某个模块失败,则退出playbook
  • 如果blockrescue的模块中,有ignore_errors: yes选项,则会忽略该报错模块

在这里插入图片描述
示例1,参考图1

[root@node-137 ansible]# cat block-1.yml
---
- hosts: db1
  tasks:
  - name: task1
    block:
    - debug: msg="block1"
    - shell: "ls /"
    - debug: msg="block2"
    rescue:
    - debug: msg="rescue1"
    - debug: msg="rescue2"
  - name: task2
    debug: msg="task2"
    
[root@node-137 ansible]# ansible-playbook block-1.yml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "block1"
}

TASK [shell] **************************************************************************************************************************
changed: [node-138]

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "block2"
}

TASK [task2] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "task2"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

示例2,参考图2

[root@node-137 ansible]# cat block-1.yml
---
- hosts: db1
  tasks:
  - name: task1
    block:
    - debug: msg="block1"
    - shell: "ls /aa.txt"
    - debug: msg="block2"
    rescue:
    - debug: msg="rescue1"
    - debug: msg="rescue2"
  - name: task2
    debug: msg="task2"
[root@node-137 ansible]# ansible-playbook block-1.yml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "block1"
}

TASK [shell] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.032879", "end": "2023-12-20 21:52:57.557622", "msg": "non-zero return code", "rc": 2, "start": "2023-12-20 21:52:57.524743", "stderr": "ls: cannot access /aa.txt: No such file or directory", "stderr_lines": ["ls: cannot access /aa.txt: No such file or directory"], "stdout": "", "stdout_lines": []}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "rescue1"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "rescue2"
}

TASK [task2] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "task2"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0

示例3,参考图3

[root@node-137 ansible]# cat block-1.yml
---
- hosts: db1
  tasks:
  - name: task1
    block:
    - debug: msg="block1"
    - shell: "ls /aa.txt"
      ignore_errors: true
    - debug: msg="block2"
    rescue:
    - debug: msg="rescue1"
    - debug: msg="rescue2"
  - name: task2
    debug: msg="task2"
[root@node-137 ansible]# ansible-playbook block-1.yml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "block1"
}

TASK [shell] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.035454", "end": "2023-12-20 21:56:08.510199", "msg": "non-zero return code", "rc": 2, "start": "2023-12-20 21:56:08.474745", "stderr": "ls: cannot access /aa.txt: No such file or directory", "stderr_lines": ["ls: cannot access /aa.txt: No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "block2"
}

TASK [task2] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "task2"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

32.3 循环语句

在playbook中用loop来循环列表中的元素,在loop中,使用一个固定的变量item,然后把每个元素赋值给item。格式,

list1: [a,b,c]
...
debug: msg={{item}}
loop: "{{list1}}"
#或 
#with_items: "{{list1}}"
  • 这里关键字loop可以替换为with_items,含义相同
  • loopwith_items后面的{{}}需要使用""双引号或''单引号引起来
[root@node-137 ansible]# cat loop-1.yml
---
- hosts: db1
  gather_facts: false
  vars:
    users:
    - uname: "tom"
      age: 18
    - uname: "jerry"
      age: 19
    - uname: "jacky"
      age: 18
  tasks:
  - debug: msg={{ item }}
    with_items: "{{users}}"
  - debug: msg={{item.uname}}
    loop: '{{users}}'
  - debug: msg={{item}}
    when: item.age == 18
    loop: "{{users}}"
[root@node-137 ansible]# ansible-playbook loop-1.yml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => (item={u'uname': u'tom', u'age': 18}) => {
    "msg": {
        "age": 18,
        "uname": "tom"
    }
}
ok: [node-138] => (item={u'uname': u'jerry', u'age': 19}) => {
    "msg": {
        "age": 19,
        "uname": "jerry"
    }
}
ok: [node-138] => (item={u'uname': u'jacky', u'age': 18}) => {
    "msg": {
        "age": 18,
        "uname": "jacky"
    }
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => (item={u'uname': u'tom', u'age': 18}) => {
    "msg": "tom"
}
ok: [node-138] => (item={u'uname': u'jerry', u'age': 19}) => {
    "msg": "jerry"
}
ok: [node-138] => (item={u'uname': u'jacky', u'age': 18}) => {
    "msg": "jacky"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => (item={u'uname': u'tom', u'age': 18}) => {
    "msg": {
        "age": 18,
        "uname": "tom"
    }
}
skipping: [node-138] => (item={u'uname': u'jerry', u'age': 19})
ok: [node-138] => (item={u'uname': u'jacky', u'age': 18}) => {
    "msg": {
        "age": 18,
        "uname": "jacky"
    }
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在最后一个task中,加入判断语句when,使age等于18的user进行打印

with_items还能够迭代字典,而loop不行

[root@node-137 ansible]# cat loop-1.yml
---
- hosts: db1
  gather_facts: false
  vars:
    userdict:
      users:
        uname: "tom"
        age: 18
        age1: 18
      users2:
        uname: "jea"
        age: 19
        age1: 20
  tasks:
  - debug: msg={{ item }}
    ignore_errors: true
    with_items: "{{userdict.users}}"
  - debug: msg={{ item }}
    loop: "{{userdict}}"
[root@node-137 ansible]# ansible-playbook loop-1.yml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => (item=uname) => {
    "msg": "uname"
}
ok: [node-138] => (item=age) => {
    "msg": "age"
}
ok: [node-138] => (item=age1) => {
    "msg": "age1"
}

TASK [debug] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"msg": "Invalid data passed to 'loop', it requires a list, got this instead: {u'users2': {u'uname': u'jea', u'age': 19, u'age1': 20}, u'users': {u'uname': u'tom', u'age': 18, u'age1': 18}}. Hint: If you passed a list/dict of just one element, try adding wantlist=True to your lookup invocation or use q/query instead of lookup."}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子学会C/C++编程等级考试2022年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队2 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

Excel如何将行的值转换为列值?

问题:Excel如何将行的值转换为列值?(如图左表变成右表) 1.用 SUMIFS(求和区域, 条件区域1, 条件1, [条件区域2, 条件2], ...)函数 比如:=SUMIFS($C$2:$C$8,$A$2:$A$8,H3,$B$2:$B$8,"快车") 2.直接用简单的透视表 (1)随机点击目标目标表格任何位置,点击插入…

Gin之GORM事务(转账操作)

禁用默认事务的操作 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。 // 全局禁用 db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{SkipDef…

Just Laws -- 中华人民共和国法律文库,简单便捷的打开方式

链接&#xff1a;JustLaws | Home 一个简洁便捷的中华人民共和国法律文库&#xff0c;而且收录比较完善&#xff0c;都是平常网民可能用到比较多的法律知识&#xff0c;目前包括宪法及宪法相关法、民商法、行政法、经济法、社会法、刑法和程序法等等 页面以文档的风格展示每一…

Java设计模式:工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

正向代理和反向代理的区别与联系

一、代理 代理就相当于中间商,本来A和B是可以直接连接的,但是此时添加了一个C在中间,A跟B不直接连接,而是通过C作为中介进行连接。最常见的例子就是二手东,其实很多我们租房子时签约的人不是房子的真正房东,而是房东委托的中介,房东不想管事或者房子太多,只靠自己无法进行管理,…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

七:爬虫-数据解析之正则表达式

七&#xff1a;正则表达式概述 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xf…

Java解决不同路径问题2

Java解决不同路径问题2 01题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中…

移动云捐赠三款开源项目,加速新一代基础软件生态繁荣

随着云计算、大数据、人工智能等新领域新信息技术的发展&#xff0c;我国基础软件的自主可控极大程度地影响着产业链上下游的多样性和技术创新的发展空间。移动云作为中国移动涉云业务的主入口&#xff0c;一直坚持共享开源价值&#xff0c;积极推动中国开源软件生态的繁荣发展…

AWS 知识一:如何在AWS上启动云AD服务器(详细到极致)

前言&#xff1a; 首先这里指的云AD服务器&#xff0c;只是为了让读友更好理解。云AD服务器在AWS中称为目录。AWS一共提供了4种目录类别&#xff0c;下面我将全程使用AWS托管微软AD这种目录类别进行示例。他完全提供了和Microsoft AD的功能&#xff0c;包括NTLM&#xff0c;Ker…

机器学习基础实验(使用 Pandas 进行数据探索)

介绍 本次实验通过分析电信运营商的客户离网率数据集来熟悉 Pandas 数据探索的常用方法&#xff0c;并构建一个预测客户离网率的简单模型。 知识点 排列索引交叉表透视表数据探索 课程介绍 机器学习开放基础课程是蓝桥云课经由 Open Machine Learning Course 授权并制作的…

Oracle定时任务的创建与禁用/删除

在开始操作之前&#xff0c;先从三W开始&#xff0c;即我常说的what 是什么&#xff1b;why 为什么使用&#xff1b;how 如何使用。 一、Oracle定时器是什么 Oracle定时器是一种用于在特定时间执行任务或存储过程的工具&#xff0c;可以根据需求设置不同的时间段和频率来执行…

el-form与el-upload结合上传带附件的表单数据(后端篇)

1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈&#xff0c;参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据&#xff08;前端篇&#xff09;-CSDN博客。 2.需求描述 在OA办公系统中&#xff0c;流程表单申请人…

无约束优化问题求解笔记(1)

目录 1. 迭代求解的基本流程与停止准则1.1 迭代求解的基本流程1.2 停止准则1.3 收敛阶 2. 线搜索方法2.1 精确线搜索2.2 非精确搜索**Goldstein 准则****Wolfe 准则** 2.3 线搜索算法的收敛性 1. 迭代求解的基本流程与停止准则 1.1 迭代求解的基本流程 优化问题的解通常无法直…

[总线仲裁]

目录 一. 集中仲裁方式1.1 链式查询方式1.2 计数器查询方式1.3 独立请求方式 二. 分布式仲裁方式 总线仲裁是为了解决多个设备争用总线这个问题 \quad 一. 集中仲裁方式 \quad 集中仲裁方式: 就像是霸道总裁来决定谁先获得总线控制权 分布仲裁方式: 商量着谁先获得总线控制权 …

【六大排序详解】开篇 :插入排序 与 希尔排序

插入排序 与 希尔排序 六大排序之二 插入排序 与 希尔排序1 排序1.1排序的概念 2 插入排序2.1 插入排序原理2.2 排序步骤2.3 代码实现 3 希尔排序3.1 希尔排序原理3.2 排序步骤3.3 代码实现 4 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#xff89;下一篇文章见&am…

基于ssm高校推免报名系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把高校推免报名管理与现在网络相结合&#xff0c;利用java技术建设高校推免报名管理系统&#xff0c;实现高校推免报名的信息化。则对于进一步提高高校推免报名管理发展&#xff0c;丰富高校推免报名管理经验能起到不少的促进作用。…

智能优化算法应用:基于蜜獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜜獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜜獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜜獾算法4.实验参数设定5.算法结果6.参考文献7.MA…