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

linux中playbook的控制语句

本章主要介绍 playbook中的控制语句。
  • 使用 when 判断语句
  • block-rescue判断
  • 循环语句
一个play中可以包含多个task,如果不想所有的task全部执行,可以设置只有满足某个
条件才执行这个task,不满足条件则不执行此task。本章主要讲解when 和 block-rescue两
种判断语句。
32.1 判断语句when
when作为一个判断语句,出现在某个 task下,格式如下。
1 tasks:
2 ‐ name: aa
3 模块1
4 when: 条件1
如果条件1成立,则执行模块1,否则不执行。
注意
在when中引用变量时是不用加{{}}的。

本章实验都在/home/duan/demo3下操作,先把 demo3目录创建出来并把ansible.cfg
和 hosts拷贝进去,命令如下。
[root@pp ~]# mkdir demo3
[root@pp ~]# cp ansible.cfg hosts demo3/
[root@pp ~]# cd demo3/
[root@pp demo3]# 
32.1.1 when判断中>、<、!=的使用
练习1:写一个playbook,判断某条件是否成立,成立了才执行task,否则不执行,命令
如下。
[root@pp demo3]# cat when-1.yaml 
---
- hosts: uptasks:- name: tasks1debug: msg="111"when: 1<2
[root@pp demo3]# 
这里有一个task,判断1<2是否成立,如果成立则执行task1,屏幕上会显示111;如果不
成立则不执行taskl,屏幕上不会显示111。这里明显是成立的,所以会执行task1。运行结
果如下。
[root@pp demo3]# ansible-playbook when-1.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [tasks1] ****************************************************************************
ok: [up] => {"msg": "111"
}PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
hen后面可以有多个条件,用or或and作为连接符。
如果用or作为连接符,只要有一个条件成立即可,只有所有的条件都不成立时,整体才不成
立。
练习2:修改when-1.yaml的内容如下。
[root@pp demo3]# cat when-1.yaml 
---
- hosts: uptasks:- name: tasks1debug: msg="111"when: 1<2 or 2>3
此处用or作为连接符,只要有一个条件成立就会成立,2>3不成立,但是1<2成立,所以
整体上就是成立的。运行结果如下。
[root@pp demo3]# ansible-playbook when-1.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [tasks1] ****************************************************************************
ok: [up] => {"msg": "111"
}PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
常见的判断符包括以下6种。
(1)==:等于。
(2)!=:不等于。
(3)>:大于。
(4)>=:大于等于。
(5)<:小于。
(6)<=:小于等于。
练习:如果server2的系统主版本是7(RHEL/CentOS7),则打印111,否则不打印。
playbook的内容如下。
[root@pp demo3]# cat when-2.yaml 
---
- hosts: uptasks:- name: tasks2debug: msg="111"when: ansible_distribution_major_version == "7"
[root@pp demo3]# 
因为server2的系统是RHEL8,所以不会执行此task2,即不会显示111。
[root@pp demo3]# ansible-playbook when-2.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [tasks2] ****************************************************************************
skipping: [up]PLAY RECAP *******************************************************************************
up                         : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
注意
ansible_distribution major version的值是一个字符串,所以when判断中=后面的7是要加引号
的。
练习2:修改when-2.yaml 的内容如下。
[root@pp demo3]# cat when-2.yaml 
---
- hosts: uptasks:- name: tasks2debug: msg="111"when: ansible_distribution_major_version == "8"
[root@pp demo3]# 
再次运行此playbook,命令如下,会显示111。
[root@pp demo3]# ansible-playbook when-2.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [tasks2] ****************************************************************************
ok: [up] => {"msg": "111"
}PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [root@pp demo3]# 
再次提醒:在when 中引用变量时是不用加{{}}的。
32.1.2 when判断中in的用法
在when语句中,除可以使用上面的大于、小于等判断方法外,还可以使用 in,用法如
下。
1 value in 列表
如果此值在这个列表中,则判断成立,否则不成立。
练习:判断某值是否在列表中,编写 when-3.yaml,命令如下。
[root@pp demo3]# cat when-3.yaml 
---
- hosts: upvars:list1: [1,2,3,4]tasks:- name: task3debug: msg="333"when: 2 in list1
[root@pp demo3]# 
此处定义了一个列表 list1,里面有4个值,分别为1、2、3、4;定义了一个task打印333,
会不会执行这个task,就要看when后面的判断是否成立。如果2在列表list1中,则执行;如果
不在,则不执行,很明显2在列表list1中,所以会执行此task,即屏幕上会显示333。运行结
果如下。
[root@pp demo3]# ansible-playbook when-3.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [task3] *****************************************************************************
ok: [up] => {"msg": "333"
}PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
因为2在列表list1中,when判断成立,可以正确执行task3,所以屏幕上会显示333。修
改when-3.yaml的内容如下。
[root@pp demo3]# cat when-3.yaml 
---
- hosts: upvars:list1: [1,2,3,4]tasks:- name: task3debug: msg="333"when: 2 not in list1
[root@pp demo3]# 
这里判断的是2不在列表list1中,但2是在列表list1中的,所以判断不成立。运行结果如
下。
[root@pp demo3]# ansible-playbook when-3.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [task3] *****************************************************************************
skipping: [up]PLAY RECAP *******************************************************************************
up                         : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   [root@pp demo3]# 
因为when判断不成立,所以屏幕上不会显示333。回想前面的例子。
[root@pp demo3]# cat /root/demo2/9-inventory1.yaml 
---
- hosts: dbtasks:- name: 打印我在清单文件中的名称debug: msg={{inventory_hostname}}when: inventory_hostname in groups ['xx']
[root@pp demo3]# 
这里判断当前正在执行的主机是不是属于主机组xx,如果是则执行debug,如果不是则不执
行。
32.1.3 when判断中is的用法
is可以用于判断变量是否被定义,常见的判断包括以下3种。
(1)is defined:变量被定义。
(2)is undefined:等同于is not defined,变量没有被定义。
(3)is none:变量被定义了,但是值为空。
看下面的例子。
[root@pp demo3]# cat when-4.yaml 
---
- hosts: upvars:aa: 1bb:tasks:- name: tasks1debug: msg="111"when: aa is undefined- name: tasks2debug: msg="222"when: bb is undefined- name: tasks3debug: msg="333"when: cc is not defined
[root@pp demo3]# 
首先定义了两个变量:aa和 bb,其中bb的值为空,此处并没有定义cc。后面定义了以下
3个task。
(1)如果aa被定义了,则显示111,这里aa被定义了,所以判断成立,会执行task1。
(2)如果b没有被定义,则显示222,这里bb被定义了,所以判断不成立,不会执行
task2。
(3)如果cc没有被定义,则显示333,这里cc没有被定义,所以判断成立,会执行
task3。
这里is undefined 和is not defined是一个意思。
查看运行的结果,如下所示。
[root@pp demo3]# ansible-playbook when-4.yamlPLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [tasks1] ****************************************************************************
skipping: [up]TASK [tasks2] ****************************************************************************
skipping: [up]TASK [tasks3] ****************************************************************************
ok: [up] => {"msg": "333"
}PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
32.2判断语句block-rescue
对于when来说,只能做一个判断,成立就执行,不成立就不执行。block和rescue一般
同用,类似于shell判断语句中的if-else,在block下面可以包含多个模块,来判断这多个模块
是否执行成功了。
block-rescue的用法如下。
1 block:
2 ‐ 模块1
3 ‐ 模块2
4 ‐ 模块3
5 rescue:
6 ‐ 模块1
7 ‐ 模块2
先执行 block中的模块1,如果没有报错,则继续执行模块2,如果block中的所有模块都
执行成功了,则跳过rescue 中的所有模块,直接执行下一个task中的模块,如图32-1所 示。
这里有2个task : task1和 task2,在 task1的block中有3个模块,rescue中有2个模块。
如果 block1中的所有模块都正确执行了,则不执行rescue中的模块,直接执行task2。
如果 block中的任一模块执行失败,block中其他后续的模块都不再执行,然后会跳转执行
rescue 中的模块,如图32-2所示。

这里block1中的模块1执行完成之后会执行模块2,如果模块2报错,则不会执行模块3,
直接跳转到rescue中,执行模块x。rescue中的所有模块全部正确执行完成之后,则执行
task2。
如果rescue中的某个模块执行失败,则退出整个playbook,如图32-3所示。
这里 block中的模块2执行失败,则跳转到rescue中执行模块x,如果模块x执行失败,则退
出整个 playbook,即也不会执行task2了。
如果某个报错模块有 ignore_errors: yes选项,则会忽略此模块的错误,继续执行下一个
模块,如图32-4所示。

这里block中的模块2执行失败了,但是因为加了ignore_errors: yes选项,所以会忽略这
个报错模块,继续执行模块3。
练习1:按上面的描述写一个playbook,内容如下。
[root@pp demo3]# cat block-1.yaml 
---
- hosts: uptasks:- name: task1block:- name: 11debug: msg="1111"- name: 22shell: "ls /aa.txt"- name: 33debug: msg="3333"rescue:- name: xxdebug: msg="xxxx"- name: yydebug: msg="yyyy"- name: task2debug: msg="zzzz"[root@pp demo3]# 
这里在task1的block中运行了3个模块,第一个模块可以正确执行,第二个模块是执行一
个系统命令ls /aa.txt,但是在server2中是不存在/aa.txt这个文件的,所以这个模块会执行
失败。block中的第三个模块不再执行,直接跳转到rescue中的模块。rescue中的2个模块均
可正确执行,然后执行task2。
所以,屏幕上会显示1111, xxxx, yyyy, zzzz。运行结果如下。
[root@pp demo3]# ansible-playbook block-1.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [debug] *****************************************************************************
ok: [up] => {"msg": "1111"
}TASK [shell] *****************************************************************************
fatal: [up]: FAILED! => {"changed": true, "cmd": "ls /aa.txt", "delta": "0:00:00.009915", "end": "2023-12-22 11:38:31.526934", "msg": "non-zero return code", "rc": 2, "start": "2023-12-22 11:38:31.517019", "stderr": "ls: 无法访问'/aa.txt': 没有那个文件或目录", "stderr_lines": ["ls: 无法访问'/aa.txt': 没有那个文件或目录"], "stdout": "", "stdout_lines": []}TASK [xx] ********************************************************************************
ok: [up] => {"msg": "xxxx"
}TASK [yy] ********************************************************************************
ok: [up] => {"msg": "yyyy"
}TASK [task2] *****************************************************************************
ok: [up] => {"msg": "zzzz"
}PLAY RECAP *******************************************************************************
up                         : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

32.3 循环语句

在shell中 for循环的用法如下。
1 for i in A B C ... ; do
2 命令 $
3 done
这里首先把A赋值给i,执行do和done之间的命令;然后把B赋值给i,执行do和 done之间
的命令,以此类推,直到把in后面所有的值执行完毕。for后面的变量可以随便命名。
再回顾一下前面介绍的列表,如下所示。
1 employee:
2 ‐ uname: lisi
3 age: 22
4 sex: man
5
6 ‐ uname: wangwu
7 age: 24
8 sex: man
9
10 ‐ uname: xiaohua
11 age: 21
这里列表employee中有3个元素,分别记录了lisi、wangwu、xiaohua的信息。我们把
这3个元素当成刚讲的for循环中的A、B、C。先把第一个元素赋值给变量,执行某个操作,
完成之后再把第二个元素赋值给变量。
用for循环A、B、C,在playbook中用loop来循环列表中的元素。在for循环中,指定一个
变量如i,然后分别把A、B、C赋值给i。 在loop中,使用一个固定的变量 item,然后把每个元素赋值给item,如图32-5所示。第
二次循环,如图32-6所示。

练习1:定义一个列表users,然后循环这个列表中的每个元素,命令如下。
[root@pp demo3]# cat loop-1.yaml 
---
- hosts: upvars:users:- uname: tomage: 20sex: man- uname: bobage: 22sex: man- uname: maryage: 20sex: womantasks:- name: task1debug: msg={{ item }}loop: "{{ users }}"
[root@pp demo3]# 
这里定义了一个列表users,里面包含了3个用户的信息,在taskl中用loop开始循环这个
列表。loop后面写列表名时,需要使用引号引起来,这里的关键字loop可以换成关键字
with_items.
这里首先把users的第一个元素赋值给item,用debug 打印;然后把users的第二个元素赋
值给item,用 debug打印,直到把所有的元素都赋值给 item。
运行此 playbook,命令如下。
[root@pp demo3]# ansible-playbook loop-1.yaml 
PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [task1] *****************************************************************************
ok: [up] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {"msg": {"age": 20,"sex": "man","uname": "tom"}
}
ok: [up] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {"msg": {"age": 22,"sex": "man","uname": "bob"}
}
ok: [up] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) => {"msg": {"age": 20,"sex": "woman","uname": "mary"}
}PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
练习2:修改loop-1.yaml的内容如下。
[root@pp demo3]# cat loop-1.yaml 
---
- hosts: upvars:users:- uname: tomage: 20sex: man- uname: bobage: 22sex: man- uname: maryage: 20sex: womantasks:- name: task1debug: msg={{ item.uname }}loop: "{{ users }}"
[root@pp demo3]# 
列表的每个元素都是一个字典,所以 item就是字典,要获取这个字典中的uname变量,用
item.uname即可。
运行此 playbook,命令如下。
[root@pp demo3]# ansible-playbook loop-1.yaml PLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [task1] *****************************************************************************
ok: [up] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {"msg": "tom"
}
ok: [up] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {"msg": "bob"
}
ok: [up] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) => {"msg": "mary"
}PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
练习3:如果想打印所有性别为男的那些用户名,修改loop-1.yaml 的内容如下。
[root@pp demo3]# cat loop-1.yaml 
---
- hosts: upvars:users:- uname: tomage: 20sex: man- uname: bobage: 22sex: man- uname: maryage: 20sex: womantasks:- name: task1debug: msg={{ item.uname }}when: item.sex == "man"loop: "{{ users }}"
[root@pp demo3]# 
在此playbook中,我们用when加了一个判断。循环列表时,首先把第一个元素赋值给
item,然后判断item.sex的值是否为man,如果是则判断成立,执行debug模块;如果不是 则判断不成立,不执行debug模块。
第一次循环结束之后,开始第二次循环,把第二个元素赋值给item之后,做相同的判
断。运行此 playbook,命令如下。
[root@pp demo3]# ansible-playbook loop-1.yamlPLAY [up] ********************************************************************************TASK [Gathering Facts] *******************************************************************
ok: [up]TASK [task1] *****************************************************************************
ok: [up] => (item={'uname': 'tom', 'age': 20, 'sex': 'man'}) => {"msg": "tom"
}
ok: [up] => (item={'uname': 'bob', 'age': 22, 'sex': 'man'}) => {"msg": "bob"
}
skipping: [up] => (item={'uname': 'mary', 'age': 20, 'sex': 'woman'}) PLAY RECAP *******************************************************************************
up                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [root@pp demo3]# 
这样就把所有性别为男的用户名打印出来了。

相关文章:

linux中playbook的控制语句

本章主要介绍 playbook中的控制语句。 使用 when 判断语句 block-rescue判断 循环语句 一个play中可以包含多个task&#xff0c;如果不想所有的task全部执行&#xff0c;可以设置只有满足某个 条件才执行这个task&#xff0c;不满足条件则不执行此task。本章主要讲解when 和 …...

MongoDB介绍

一、MongoDB介绍 1.1 mongoDB介绍 MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB …...

再看参数校验

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 写一个接口&#xff0c…...

计算机存储术语: 扇区,磁盘块,页

扇区(sector) 硬盘的读写以扇区为基本单位。磁盘上的每个磁道被等分为若干个弧段&#xff0c;这些弧段称之为扇区。硬盘的物理读写以扇区为基本单位。通常情况下每个扇区的大小是 512 字节。linux 下可以使用 fdisk -l 了解扇区大小&#xff1a; $ sudo /sbin/fdisk -l Disk …...

解决IDEA编译/启动报错:Abnormal build process termination

报错信息 报错信息如下&#xff1a; Abnormal build process termination: "D:\Software\Java\jdk\bin\java" -Xmx3048m -Djava.awt.headlesstrue -Djava.endorsed.dirs\"\" -Djdt.compiler.useSingleThreadtrue -Dpreload.project.path………………很纳…...

Jetpack DataStore

文章目录 Jetpack DataStore概述DataStore 对比 SP添加依赖库Preferences DataStore路径创建 Preferences DataStore获取数据保存数据修改数据删除数据清除全部数据 Proto DataStore配置AndroidStudio安装插件配置proto文件创建序列化器 创建 Proto DataStore获取数据保存数据修…...

在Portainer创建Nginx容器并部署Web静态站点实现公网访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…...

泛微e-cology XmlRpcServlet文件读取漏洞复现

漏洞介绍 泛微新一代移动办公平台e-cology不仅组织提供了一体化的协同工作平台,将组织事务逐渐实现全程电子化,改变传统纸质文件、实体签章的方式。泛微OA E-Cology 平台XmRpcServlet接口处存在任意文件读取漏洞&#xff0c;攻击者可通过该漏洞读取系统重要文件 (如数据库配置…...

当下流行的直播技术demo演示

nginx-http-flv-module&#xff08;更新不是很频繁&#xff09; SRS: https://ossrs.net/lts/zh-cn/&#xff08;独立官网&#xff0c;目前最新稳定版version5&#xff09; 基于SRS搭建直播demo演示&#xff1a; 一、搭建流媒体服务器 参见官网&#xff1a;https://ossrs.ne…...

Zabbix自动发现并注册已安装agent的主机

先在被监控主机上安装好zabbix-agent 然后登录zabbix网页 点击发现动作后会出现第三步 然后编辑操作&#xff0c;发现后加入到主机组群 然后编辑发现规则 然后就可以在主机列表中看到被发现的主机。...

Jtti:linux搭建开源ldap服务器的方法

搭建开源LDAP服务器是一种用于集中管理用户身份认证和授权信息的方法。在Linux系统上&#xff0c;OpenLDAP是一个流行的开源LDAP实现&#xff0c;可以用于搭建LDAP服务器。以下是搭建OpenLDAP服务器的基本步骤&#xff1a; 步骤一&#xff1a;安装OpenLDAP 安装OpenLDAP软件包&…...

Gazebo GUI模型编辑器

模型编辑器 现在我们将构建我们的简单机器人。我们将制作一个轮式车辆&#xff0c;并添加一个传感器&#xff0c;使我们能够让机器人跟随一个斑点&#xff08;人&#xff09;。 模型编辑器允许我们直接在图形用户界面 &#xff08;GUI&#xff09; 中构建简单的模型。对于更复…...

pycharm运行正常,但命令行执行提示module不存在的多种解决方式

问题描述 在执行某个测试模块时出现提示&#xff0c;显示自定义模块data不存在&#xff0c;但是在PyCharm下运行正常。错误信息如下&#xff1a; Traceback (most recent call last):File "/run/channelnterface-autocase/testcases/test_chanel_detail.py", line 2…...

GBASE南大通用GBase 8a ODBC的安装文件

GBASE南大通用GBase 8a ODBC 体系结构是基于五个组件&#xff0c;在下图中所示&#xff1a; GBase 8a ODBC 体系结构图  应用 应用是通过调用 ODBC API 实现对 GBase 数据访问的程序。应用使用标准的 ODBC 调用与驱动程序管理器通信。应用并不关心数据存储在哪里&#xff…...

重新配置torch1.8 cuda11.1 torchtext0.9.0虚拟Pytorch开发环境

这里写目录标题 起因发现选择安装cuda 11.1核对下自己的显卡是否支持下载该版本的CUDACUDA下载地址CUDA安装过程 在anaconda中创建一个虚拟环境1.以下是环境的配置过程2.查看虚拟环境列表3.激活虚拟环境 安装torch和torchtext包的过程1.输入下面这句代码&#xff0c;就可以直接…...

【动画图解】一次理清九大排序算法!面试官问到再也不慌!

排序算法 交换排序 冒泡排序快速排序 插入排序 直接插入排序希尔排序 选择排序 简单选择排序堆排序 归并排序基数排序桶排序 一、冒泡排序 冒泡排序是一种简单的交换排序算法&#xff0c;以升序排序为例&#xff0c;其核心思想是&#xff1a; 从第一个元素开始&#xff0c…...

组播地址段及其作用

作用 组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据&#xff0c;也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。 地址段 组播协议的地址在 IP 协议中属于 D 类…...

Vue+ElementUI前端添加展开收起搜索框按钮

1、搜索框添加判断 v-if"advanced" <el-form-item label"创建日期" v-if"advanced"><el-date-pickerv-model"daterangeLedat"size"small"style"width: 240px"value-format"yyyy-MM-dd"type&q…...

速盾网络:sdk游戏盾有什么作用?

速盾cdn是一款非常优秀的CDN加速服务&#xff0c;它能够帮助游戏开发者们提升游戏的性能和稳定性。其中&#xff0c;速盾cdn的sdk游戏盾是其一项非常实用的功能&#xff0c;它能够为游戏提供更加稳定和快速的网络连接。 首先&#xff0c;让我们来了解一下什么是sdk游戏…...

理解BeEF的架构

BeEF的组件和工作原理BeEF&#xff08;The Browser Exploitation Framework&#xff09;是一款用于浏览器渗透测试和漏洞利用的强大工具。它由多个组件组成&#xff0c;这些组件协同工作以实现对受害者浏览器的控制和攻击。本文将深入探讨BeEF的各个组件和其工作原理&#xff0…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...