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

38.Ansible判断+实例

Ansible判断+实例

when 语句是 Ansible 中用于控制任务是否执行的核心指令

用于比较变量、字符串或数字。

运算符描述
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于

用于组合多个条件。

运算符描述示例
and逻辑与when: ansible_os_family == "RedHat" and ansible_processor_cores >= 2
or逻辑或when: ansible_distribution == "CentOS" or ansible_distribution == "Rocky"
not逻辑非when: not webserver_enabled

Defined:判断变量是否已经定义,已定义则返回为真

Undefined:判断变量是否已经定义,未定义则返回为真

None:判断变量值是否为空,如果变量已经定义,但是变量值为空,则返回为真

---
- name: ahosts: node1vars:aa: 11cc:tasks:- name: debug1debug:msg: aawhen: aa is defined- name: debug2debug:msg: vvvwhen: bb is undefined- name: debug3debug:msg: addwhen: cc is none

在这里插入图片描述


判断执行结果

状态判断条件含义
is success 或 succeeded判断任务是否执行成功
failure 或 failed判断任务是否执行失败
changed 或 change判断任务是否改变了系统状态
skipped或skip判断任务是否被跳过
---
- name: ahosts: node1vars:aa: 11tasks:- name: b1shell:cmd: ls /mntwhen: aa==11register: dd- name: b2debug:msg: this successwhen: dd is success- name: b3debug:msg: this failedwhen: dd is failed- name: b4debug:msg: this changedwhen: dd is changed- name: b5debug:msg: this skipwhen: dd is skip

在这里插入图片描述


以下tests的判断均对ansible主机中的路径,与目标主机无关

测试器描述
file判断路径是否是一个普通文件
directory判断路径是否是一个目录
link判断路径是否是一个符号链接(软链接)
mount判断路径是否是一个挂载点
exists判断路径是否存在(可以是文件、目录、链接等)
---
- name: ahosts: node1vars:a1: /test/file1a2: /test/a3: /test/softlinkaa4: /test/hardlinkaa5: /boot/tasks:- name: de1debug:msg: filewhen: a1 is file- name: de2debug:msg: directorywhen: a2 is directory- name: de3debug:msg: softlinkawhen: a3 is link- name: de4debug:msg: hardlink when: a4 is link- name: de5debug:msg: mountwhen: a5 is mount- name: de6debug:msg: existswhen: a1 is exists

在这里插入图片描述


lower:判断包含字母的字符串中的字母是否纯小写

upper:判断包含字母的字符串中的字母是否纯大写

---
- name: ahosts: node1vars:a1: aaabbbbcccca2: AAABBBCCCa3: a222bbbctasks:- name: t1debug:msg: all lowerwhen: a1 is lower- name: t2debug:msg: all upperwhen: a2 is upper- name: t3debug:msg: aa22when: a3 is lower

在这里插入图片描述


string:判断对象是否是一个字符串

number:判断对象是否一个数字

---
- name: ahosts: node1vars:a1: 1a2: "2"a3: btasks:- name: a11debug:msg: numberwhen: a1 is number- name: a22debug:msg: stringwhen: a2 is string- name: a33debug:msg: stringwhen: a3 is string

在这里插入图片描述


block/rescue/always

区块类比编程语言描述
blocktry主要执行区块。在这里定义您希望正常执行的核心任务。
rescuecatch救援区块。只有当 block 中的任何一个任务失败时,这里的任务才会执行。
alwaysfinally总是执行区块。无论 block 成功还是失败(即使触发了 rescue),这里的任务总是会执行
创建一个名为/etc/ansible/lv.yml 的playbook,它将在所有受管节点上运行以执行下列任务:

在node1、node2上添加一块硬盘,然后新建卷组

Node1的卷组大小为2G 卷组名为research

Node2的卷组大小为1G 卷组名为research

创建符合以下要求的逻辑卷:

​ 逻辑卷创建在research卷组中

​ 逻辑卷名称为data

​ 逻辑卷大小为1500MiB

​ 使用ext4文件系统格式化逻辑卷

​ 如果无法创建请求的逻辑卷大小,应显示错误消息

​ Could not create logical volume of that size,并且应改为使用大小 800MiB。

​ 如果卷组research 不存在 ,应显示错误消息

​ Volume group does not exist。

​ 不要以任何方式挂载逻辑卷

1.新建卷组
---
- name: ahosts: node1tasks:- name:yum:name: lvm2state: present- name: parted1parted:device: /dev/vdbnumber: 1part_type: primarypart_start: 10MiBpart_end: 2010MiBstate: present- name: p1lvg:pvs: /dev/vdb1vg: research- name: n2hosts: node2tasks:- name:yum:name: lvm2state: present- name: p222parted:device: /dev/vdbnumber: 1part_type: primarypart_start: 10MiBpart_end: 1000MiBstate: present- name: p33lvg:vg: researchpvs: /dev/vdb1
2.创建逻辑卷
---
- name: chosts: alltasks:- name: c1block:- name: lv1lvol:vg: researchlv: datasize: 1500rescue:- name: c2debug:msg: Could not create logical volume of that size- name: c3lvol:vg: researchlv: datasize: 800always:- name: c4filesystem:dev: /dev/research/datafstype: ext4when: "'research' in ansible_lvm.vgs"- name: c5debug:msg: Volume group does not existwhen: "'research' not in ansible_lvm.vgs"    

在这里插入图片描述


file_when能够中断剧本
---
- name: v1hosts: node1tasks:- name: debug1debug:msg: 114514- name: s1shell:cmd: echo 1234register: bbfailed_when: "'12' in bb.stdout"- name: s2debug:msg: xyh

ignore_errors: yes 跳过错误、忽略错误

Changed_when:可以修改任务执行后的最终状态,或者可以让任务执行状态显示失败


从 http://ansible.example.com/materials/newhosts.j2 下载模板文件
完成该模板文件,用来生成新主机清单(主机的显示顺序没有要求),结构如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.122.10 node1.example.com node1
192.168.122.20 node2.example.com node2
192.168.122.30 node3.example.com node3
192.168.122.40 node4.example.com node4
192.168.122.50 node5.example.com node5
创建剧本/home/student/ansible/newhosts.yml,它将使用上述模板在 test01 主机组的主机上
生成文件/etc/newhosts。

1.首先下载模板文件

[student@master ansible]$ curl -O http://ansible.example.com/materials/newhosts.j2

2.编辑newhosts文件

[student@master ansible]$ vim newhosts.j2
{% for xyh in groups.all %}
{{ hostvars[xyh].ansible_default_ipv4.address }} {{ hostvars[xyh].ansible_fqdn }} {{ hostvars[xyh].ansible_hostname }}
{% endfor %}

3.编辑剧本

[student@master ansible]$ vim newhosts.yml
---
- name: get facthosts: all
- name: cphosts: node1tasks:- name: cp1template:src: /home/student/ansible/newhosts.j2dest: /etc/newhosts

查看node1的/etc/newhosts文件

在这里插入图片描述


编写剧本修改远程文件内容
创建剧本 /home/student/ansible/newissue.yml,满足下列要求:
1)在所有清单主机上运行,替换/etc/issue 的内容
2)对于 test01 主机组中的主机,/etc/issue 文件内容为 test01
3)对于 test02 主机组中的主机,/etc/issue 文件内容为 test02
4)对于 web 主机组中的主机,/etc/issue 文件内容为 Webserver

1.编辑newissue.yml剧本

[student@master ansible]$ vim newissue.yml
---
- name: rplhosts: alltasks:- name: t1copy:content: |{% if 'test01' in group_names %}test01{% elif 'test02' in group_names %}test02{% elif 'web' in group_names %}Webserver{% endif %}dest: /etc/issue

2.查看test01下的/etc/issue 的内容

在这里插入图片描述

http://www.xdnf.cn/news/1438381.html

相关文章:

  • PINN物理信息神经网络用于求解二阶常微分方程(ODE)的边值问题,Matlab实现
  • 力扣hot100:缺失的第一个正数(哈希思想)(41)
  • Qwen3-30B-A3B 模型解析
  • 【C++】迭代器详解与失效机制
  • # Shell 文本处理三剑客:awk、sed 与常用小工具详解
  • 【前端面试题✨】Vue篇(一)
  • Linux网络序列化与反序列化(6)
  • Linux文本处理——awk
  • 飞牛OS Nas,SSH安装宝塔后,smb文件不能共享问题
  • STM32——串口
  • 2025年- H109-Lc1493. 删掉一个元素以后全为 1 的最长子数组(双指针)--Java版
  • 别再误会了!Redis 6.0 的多线程,和你想象的完全不一样
  • 从入门到实战:Linux sed命令全攻略,文本处理效率翻倍
  • 【机器学习深度学习】向量模型与重排序模型:RAG 的双引擎解析
  • 使用DataLoader加载本地数据 食物分类案例
  • GitHub Classroom:编程教育的高效协作方案
  • MySQL查询limit 0,100和limit 10000000,100有什么区别?
  • Shell编程从入门到实践:基础语法与正则表达式文本处理指南
  • 如何在部署模型前训练出完美的AI提示词
  • C# 中这几个主流的 ORM(对象关系映射器):Dapper、Entity Framework (EF) Core 和 EF 6
  • 11.《简单的路由重分布基础知识探秘》
  • 硬件:51单片机
  • 为什么需要锁——多线程的数据竞争是怎么引发错误的
  • 系统架构——过度设计
  • YOLOv8改进有效系列大全:从卷积到检测头的百种创新机制解析
  • 【C++上岸】C++常见面试题目--数据结构篇(第十七期)
  • 02-Media-2-ai_rtsp.py 人脸识别加网络画面RTSP推流演示
  • 51单片机(单片机基础,LED,数码管)
  • Spring Boot手写10万敏感词检查程序
  • UCIE Specification详解(十三)