Ansible自定义静态资产以及常用模块

news2024/11/23 6:37:21

静态资产

文件文件,一个格式类似于INI的文件
默认情况下,Ansible的资产文件位于/etc/ansible/host,如果使用pip安装的则可能没有这文件,可以自己创建。
1、自定义资产
#自定义编写inventory.ini文件
 
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.gyq.com
test03.gyq.com
test[05:09].gyq.com

[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5

[db_servers]
192.168.2.2
192.168.2.3
192.168.1.5

[all_servers]
[all_servers:children]
db_servers
web_servers
1.2如何使用自定义资产
通过-i 参数指定自定义资产的位置即可(可以是全路径,也可以是相对路径)。
ansible all -i inventory.ini ... //伪指令, 不可执行

1.3 如何验证自定义资产
ansible db_servers -i inventory.ini --list-hosts

2、资产选择器
只对部分服务器进行操作,可以使用PATTERN资产选择器
2.1 基本语法格式
ansible PATTERN -i inventory -m module -a argument
使用案例
#选择单个IP
[root@GYQ-master ~]# ansible 1.1.1.1 -i inventory.ini --list-hosts
  hosts (1):
    1.1.1.1
#选择一组
[root@GYQ-master ~]# ansible web_servers -i inventory.ini --list-hosts
  hosts (3):
    192.168.1.2
    192.168.1.3
    192.168.1.5
#使用*号选定
[root@GYQ-master ~]# ansible 3.3.3.1* -i inventory.ini --list-hosts
  hosts (7):
    3.3.3.10
    3.3.3.11
    3.3.3.12
    3.3.3.13
    3.3.3.14
    3.3.3.15
    3.3.3.1

#使用逻辑匹配
web_server和db_servers的并集
显示两个族内的所有主机
[root@GYQ-master ~]# ansible 'web_servers:db_servers' -i inventory.ini --list-hosts
  hosts (5):
    192.168.1.2
    192.168.1.3
    192.168.1.5
    192.168.2.2
    192.168.2.3
web_server和db_servers的交集
[root@GYQ-master ~]# ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts
  hosts (1):
    192.168.1.5

#在web_server中,但是不在db_servers中    排除
[root@GYQ-master ~]# ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts
  hosts (2):
    192.168.1.2
    192.168.1.3
Ad-hoc命令相当于一个shell命令
命令语法格式:
ansible pattern [-i inventory] -m module -a argument
pattern 资产选择其
-i 指定资产清单文件的位置
-m 自定本次Ansible ad-hoc要执行的模块。可以类别成SHELL中的命令。
-a 模块的参数,可以类比成SHELL中的命令参数
Ansible模块类型
帮助文档
列举出所有的核心模块和附加模块
ansible-doc -l
查询某个模块的使用方法
ansible-doc 模块名
查询某个模块的使用方法,比较简洁的信息
ansible-doc -s 模块名
常用模块
先准备测试文件hosts
[dbservers]
192.168.40.137

[webservers]
192.168.40.138
4.1 command & shell 模块
两个模块都是在远程服务器上执行命令
但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。
[root@GYQ-master ~]# ansible all -i hosts -a "echo 'hello'"
192.168.40.137 | CHANGED | rc=0 >>
hello
192.168.40.138 | CHANGED | rc=0 >>
hello
[root@GYQ-master ~]# ansible all -i hosts -m shell -a "echo 'hello'"
192.168.40.138 | CHANGED | rc=0 >>
hello
192.168.40.137 | CHANGED | rc=0 >>
hello
[root@GYQ-master ~]#
两个模块的差异
shell    模块可以执行SHELL的内置命令和特性(比如管道符)。
command模块无法执行SHELL的内置命令和特性
script模块
#ansible webservers -i hosts -m script -a "/root/a.sh"

192.168.40.138 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 192.168.40.138 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 192.168.40.138 closed."
    ],
    "stdout": "",
    "stdout_lines": []
}

copy模块
copy 模块的主要用于管理节点和被管理节点之间的文件拷贝
经常使用到参数如下:
src指定拷贝文件的源地址dest指定拷贝文件的目标地址
backup拷贝文件前,若原始文件发生变化,则对目标文件进行备份
woner 指定新拷贝文件的所有者
group 指定新拷贝文件的所有组
mode指定新拷贝文件的权限
案例:
#拷贝文件到目标主机
[root@GYQ-master ~]# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
192.168.40.138 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "21b7750daa3e959a63aab1564d748e326d565d50",
    "dest": "/etc/yum.repos.d/nginx.repo",
    "gid": 0,
    "group": "root",
    "md5sum": "640b9f8a4cc8dc99cb1a0048f28afd4f",
    "mode": "0644",
    "owner": "root",
    "secontext": "system_u:object_r:system_conf_t:s0",
    "size": 357,
    "src": "/root/.ansible/tmp/ansible-tmp-1678688946.53-7950-171811340470478/source",
    "state": "file",
    "uid": 0
}

#查看
[root@GYQ-master ~]# ansible webservers -i hosts -a "ls /etc/yum.repos.d"
192.168.40.138 | CHANGED | rc=0 >>
CentOS-Base.repo
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-fasttrack.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
epel.repo
epel-testing.repo
nginx.repo
[root@GYQ-master ~]#
copy 前, 在被管理节点上对原文件进行备份
ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
copy文件的同时对文件进行用户及用户组设置
[root@GYQ-master ~]# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"


192.168.40.138 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "21b7750daa3e959a63aab1564d748e326d565d50",
    "dest": "/etc/yum.repos.d/nginx.repo",
    "gid": 99,
    "group": "nobody",
    "mode": "0644",
    "owner": "nobody",
    "path": "/etc/yum.repos.d/nginx.repo",
    "secontext": "system_u:object_r:system_conf_t:s0",
    "size": 357,
    "state": "file",
    "uid": 99
}
copy文件的同时对文件进行权限设置
[root@GYQ-master ~]# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
192.168.40.138 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "21b7750daa3e959a63aab1564d748e326d565d50",
    "dest": "/etc/yum.repos.d/nginx.repo",
    "gid": 99,
    "group": "nobody",
    "mode": "0755",
    "owner": "nobody",
    "path": "/etc/yum.repos.d/nginx.repo",
    "secontext": "system_u:object_r:system_conf_t:s0",
    "size": 357,
    "state": "file",
    "uid": 99
}
yum_repsitory模块
添加YUM仓库
常用参数
name 仓库名称,就是仓库文件中第一行的中括号中名称,必须的参数。
description 仓库描述信息,添加时必须的参数
baseurl yum存储库"repodata"目录所在目录的URL,添加时必须的参数。它也可以是多个URL的列表。
file 仓库文件保存到被管理节点的文件名,不包含.repo。默认是name的值。
state preset确认添加仓库文件,absent 确认删除仓库文件。
gpgcheck 是否检查GPG yes | no,没有默认值,使用/etc/yum.conf中的配置
Example

添加epel源
[root@GYQ-master ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/' description='EPEL YUM repo'"


192.168.40.137 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "repo": "epel",
    "state": "present"
}

删除epel源
[root@GYQ-master ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
192.168.40.137 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "repo": "epel",
    "state": "absent"
}
yum模块
等同于Linux上的YUM命令,对远程服务器上的RPM包进行管理
常用参数:
name    要安装的软件包名,多个软件包以逗号(,)隔开
state    对当前指定的软件安装、一处操作(present installed latest absent removed)
    支持的参数
     - present 确认已经安装,但不升级
     - installed 确认已经安装
     - latest 确保安装,且升级为最新
     - absent 和 removed 确认已移除
案例:安装一个nginx软件
ansible webservers -i hosts -m yum -a "name=nginx state=present"    #其他安装方式一致
到目标主机上查看是否安装了nginx
移除一个软件包
ansible webservers -i hosts -m yum -a "name=nginx state=removed"
安装一个软件包组
ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
systemd模块
daemon_reload 重新载入systemd, 扫描新的或有变动的单元
enabled 是否开机自启动yes |no 
name 必选项,服务名称,比如httpd vsftpd
state 对当前服务执行启动,停止、重启、重新加载等操作
(started,stopped,restarted,reloaded)
案例:重新加载系统后台进程
[root@GYQ-master ~]# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
192.168.40.138 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "name": null,
    "status": {}
}
启动nginx服务
ansible webservers -i hosts -m systemd -a "name=nginx state=started"
关闭nginx服务
ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
group模块
在被管理节点上,对组进行管理。
常用参数:
name    组名称,必须的
system  是否为系统组,yes/no    默认是no
state     删除或者创建,present/absent,默认是present
案例:
[root@GYQ-master ~]# ansible dbservers -i hosts -m group -a "name=db_admin"
192.168.40.137 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "gid": 1000,
    "name": "db_admin",
    "state": "present",
    "system": false
}
user模块
用于在被管理节点上对用户进行管理
常用参数:
name 必须的参数,指定用户名
password  设置用户的密码,这里接受一个加密的值,因为会直接存到shadow
update_password 假如设置的密码不同于原密码,则会更新密码.在1.3版本中被加入
home 指定用户的家目录
shell 设置用户的shell
comment 用户的描述信息
create_home 在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为no。2.5版本之前使用createhome
group 设置用户的主组
groups 将用户加入到多个其他组中,多个用逗号隔开。
       默认会把用户从其他已经加入的组中删除。

append yes|no和groups配合使用,yes 时,不会把用户从其他已经加入的组中删除
system 设置为yes时,将会创建一个 系统账号
expires 设置用户的过期时间,值为时间戳,会转为为天数后,放在 shadow 的第8个字段里;
generate_ssh_key设置为 yles将会为用户生成密钥,这不会覆盖原来的密钥
ssh_key_type 指定用户的密钥类型,默认 rsa,具体的类型取决于被管理
节点
state 删除或添加用户, present为添加,absent 为删除;默认值present
remove 当与state=absent -起使用,删除一个用户 及关联的目录,比如家目录,邮箱目录。可选的值为: yes/no
案例:
创建用户并设置密码
#第一步:先生成加密密码
[root@GYQ-master ~]# pass=$(echo "123456" | openssl passwd -1 -stdin)
[root@GYQ-master ~]# echo $pass
$1$KAvZ0DCJ$Tp7vgBM8qPyDq5KBQqwn2/
#第二部创建用户并设置密码
ansible all -i hosts -m user -a "name=foo password=${pass}"
创建用户yangge,并且为其创建密钥对,并且密钥类型为:ecdsa
nsible all -i hosts -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"
创建用tom,并且设置其有效期 到2023年10月1日,加入到组db_admin中,不改变原有加入的组。
ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20231001) groups=db_admin append=yes"
date命令说明
file 模块
主要用于远程主机上的文件操作
常用参数:
owner 定义文件/目录的属主
group 定义文件/目录的属组
mode 定义文件/目录的权限
path 必选项,定义文件/目录的路径
recurse 递归的设置文件的属性,只对目录有效
src 要被链接(软/硬)的源文件的路径,只应用于state=link的情况
dest 被链接到的路径,只应用于state=link的情况
state
    directory 如果目录不存在,创建目录
    file    文件不存在,则不会被创建,存在则返回文件的信息,常用于检查文件是否存在。
    link    创建软链接
    hard    创建硬链接
    touch    如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    absent    删除目录、文件或者取消链接文件
创建一个文件
ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
改变文件所有者及权限
ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
创建一个软连接
ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
创建目录
ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
取消一个链接·
ansible all -i hosts -m file -a "path=tmp/link.conf state=absent"
删除一个文件和目录
ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
ansible all -i hosts -m file -a "path=/tmp/testdir state=absent"
cron模块
管理员成节点的CRON服务。等同于Linux中的定时任务。
注意:使用Ansible创建的计划任务,是不能使用本地任务crontab -e 去编辑的,否则Ansible无法再次操作此任务了。
常用参数
name    指定一个cron job的名字。王定要指定,便于日之后删除。
minute  指定分钟,可以设置成(O-59,*,*/2等)格式。默认是*,也就是每分钟。
hour    指定小时,可以设置成(0-23,*,*/2等)格式。默认是*,也就是每小时。
day     指定天,可以设置成(1-31,*,*/2等)格式。默认是*,也就是每天。
month   指定月份,可以设置成(1-12,*,*/2等)格式。默认是*,也就是每周。
weekday 指定星期,可以设置成(O-6 for Sunday-Saturday,*等)格式。默认是*,也就是每星期。
job    指定要执行的内容,通常可以写个脚本,或者一段内容。
state    指定这个job的状态,可以是新增(present)或者是删除(absent)。默认为新增(present)
案例:
新建一个Cron Job任务
ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
删除一个CRON JOB任务
ansible all -i hosts -m cron -a "name='create new job' state=absent"
debug模块
debug模块主要用来调式时使用,通常的作用是将一个变量的值给打印出来。
常用参数:
var 直接打印一个指定的变量值
msg 打印一段可以格式化的字符串
案例:
template模块
template模块使用jinjia2格式作为文件模板,可以进行文档内变量的替换。
他的每次使用都会被ansible标记为"changed"状态。文件以.j2结尾。
常用参数:
src指定Ansible控制端的文件路径
dest指定Ansible 被控端的文件路径
owner 指定文件的属主
group指定文件的属组
mode指定文件的权限
backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了原始文件,就可以将其恢复原状。yes/no
案例:
用法和copy模块基本一样,template模块的强大之处就是使用变量替换,就是可以把传递给Ansible的变量的值替换到模板中。
1.建立一个templte文件,名为hello_world.j2
#cat hello_world.j2
Hello {{var}}    !
2.执行命令,并且设置变量 var 的值为 world
#ansible all -i hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world" -e "var=world"
3.在被控主机上验证
#cat /tmp/hello_world.world
Hello world !
lineinfile
在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。
如果是在一个文件中把所有匹配到的多行统一处理统一处理,请参考replace模块。
如果相对文件中的多行进行添加/更新/删除等操作,参考blockinfile模块
常用参数
path 被管理节点的目标文件路径,必须。
state 可选值absent 删除| present 替换(默认值)。
regexp 在文件的每- -行中查找的正则表达式。对于state=present ,仅找到的最后-行将被替换。
line 要在文件中插入/替换的行。需要state=present。
create 文件不存在时,是否要创建文件并添加内容。yes/no
案例:
删除被控节点文件里的某一条内容
ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"

替换某一行
ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SElinux=disabled' state=present"

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

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

相关文章

【C++】—— 模板介绍

前言: 在之前的学习中,我们已经对几个常见的STL库容器进行了详细的讲解,并且进行了模拟实现帮助大家立即。接下来,我们要介绍的就是关于 “模板” 的基本知识。 目录 前言 (一)非类型模板参数 1、基本介…

Splashtop 推出首款专门面向创作者和创意工作室的高性能远程软件

2023年5月3日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公的远程解决方案领域处于领先地位,公司今天宣布推出 Splashtop Business Access Performance,这是一款全新的远程访问解决方案,针对独立艺术家、游戏玩家、建筑与设计以及创意公司…

Opencv项目实战:基于dlib的疲劳检测

文章目录 一、项目简介二、算法原理三、环境配置3.1、dlib人脸检测器:dlib.get_frontal_face_detector()3.2、dlib关键点定位工具:shape_predictor_68_face_landmarks.dat 四、项目实战(加载视频)五、项目实战(摄像头获…

软件测试猿和bug的爱恨情仇

对程序猿来说改bug可以位列开发过程中最讨厌的事之首了,这么讲应该没有人会反对吧?因为就连Java之父詹姆斯高斯林也很讨厌Bug。 另一方面对于测试猿来说工作职责就是尽可能多地找出bug,并确保其得以解决。所以被程序猿视为眼中钉肉中刺的bug可…

Doris半结构化数据分析(倒排索引使用)快速入门

1. 背景 Apache Doris2.0 基于Apache Doris向量化MPP引擎,增加了倒排索引和半结构化JSON数据支持,更好地满足日志存储、检索、分析需求。与基于ES的日志存储方案相比,有如下优势: 性价比提升:存储成本降低50%以上&am…

‍☠️stm32Cubemx欠采样原理讲解与实现 采集高频信号

🏴‍☠️STM32Cubemx ADCTIMDMA欠采样采集高频信号 本文主要讲解ADC借助欠采样采集高频信号,比如使用100k左右的采样率去采集1M的信号。 所需工具: 开发板:STM32F103RCT6STM32CubeMXIDE: Keil-MDK 相关文章: STM32HAL ADCTIM…

2核4G轻量服务器阿里云和腾讯云区别对比

阿里云轻量应用服务器2核4G4M带宽297.98元12个月,腾讯云轻量2核4G5M服务器168元一年,628元3年,2核4G轻量应用服务器阿里云和腾讯云怎么选择?哪个性能比较好?阿腾云分享轻量应用服务器2核4G配置阿里云和腾讯云CPU、带宽…

打破互联网思维,我们该如何思考?

在会议上,你是否流程规范讲到一半突然卡逻辑、测分会议疯狂输出周围却一脸问号?提交缺陷时,你又是否被告知看不懂,要求补充信息?受挫时捶胸顿足“表达可太太太重要了,难道我天生脑子转的就比别人慢&#xf…

基于深度学习的高精度红外行人车辆检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度红外行人车辆检测识别系统可用于日常生活中或野外来检测与定位红外行人车辆目标,利用深度学习算法可实现图片、视频、摄像头等方式的红外行人车辆目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系…

围绕中国旅行商问题完成综合性实验报告 旅行商问题

题目:围绕中国旅行商问题完成综合性实验报告 旅行商问题(TSP问题)。 假设有一个旅行商人要拜访全国31个省会城市,它需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。…

【裸机驱动LED】使用C代码驱动LED(三)—— C代码编写篇

前面只使用了汇编代码来驱动LED,但是对于后续一些比较复杂的逻辑,使用汇编代码编写驱动的难度太大,因此,这次我们要使用C语言代码来驱动LED。 除了C代码外,依然需要编写汇编代码,在没有OS的情况下&#xf…

基于黄金莱维引导机制的阿基米德优化算法(MSAOA)-附代码

基于黄金莱维引导机制的阿基米德优化算法(MSAOA) 文章目录 基于黄金莱维引导机制的阿基米德优化算法(MSAOA)1.阿基米德优化算法2. 改进阿基米德优化算法2.1 变区间初始化策略2.2 黄金莱维引导机制2.3 自适应波长算子 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&#x…

什么是接口测试?怎么做接口测试?Apifox 教你做!

目录 前言: 一、什么是接口测试? 二、接口测试的步骤 三、接口测试工具的选择 四、总结 前言: 随着互联网和移动互联网的发展,企业面对着越来越庞大和复杂的系统和数据接口。在这种情况下,手动测试不再能够满足测…

修复uproject右键菜单完全解决方案办法

在你电脑中找到UnrealVersionSelector通常和epiclauncher是同一个根目录 epiclauncher路径是:D:\MyEpic\Epic Games\Launcher\Portal\Binaries\Win32\EpicGamesLauncher.exe UnrealVersionSelector.exe的路径是:D:\\MyEpic\\Epic Games\\Launcher\\Engine\\Binaries\\Win64\\Un…

探索新科技:3DVR电子楼书引领视觉体验革命

导语: 近年来,科技的迅猛发展引领着我们进入一个全新的数字化时代。在这个时代,虚拟现实和电子书成为了许多领域的热门话题。 接下来,让我们一起探索一个引人注目的技术创新,将虚拟现实和电子书完美结合的3DVR电子楼书…

python基本语法知识(二)

杂项 如果一个制表符/t不能对齐,可以多加几个; 只有将字典转换为字符串的时候才会保留字典的value,转成集合、列表、元组、都会丢失value 函数 例子1: str1 "hello world" # 函数定义 def my_len(data):count 0f…

基于 Ray 的大规模离线推理

本文整理自字节跳动基础架构资深研发工程师王万兴在火山引擎开发者社区 Meetup 中的分享。大模型离线推理,是指在具有数十亿或数千亿参数的大规模模型上进行分布式推理的过程。相较于常规模型推理,在模型切分、数据处理和数据流、提升 GPU 利用率方面面临…

ROCK PI S音频开发(一)系统准备

1、连接WIFI sudo nmcli r wifi on sudo nmcli dev wifi sudo nmcli dev wifi connect "SSID" password "PASSWORD" 2、更新源 sudo apt-get update sudo apt-get install git wget export DISTROfocal-stable wget -O - apt.radxa.com/$DISTRO/publ…

PHP快速实战20-PHP7中的垃圾回收机制与原理讲解

文章目录 前言PHP垃圾回收实现的原理垃圾回收机制引用计数循环垃圾收集 实现原理 总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 在计算机程序中,垃圾回收指的是一种自动管理内存的技术。在程序执行过程中,分配给它的内存会随着…

2023年软件测试趋势?测试人的发展前景?“我“到底该如何走...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 现在开始学习软件…