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

ansible自动化运维(二)剧本、角色编写实战

😘作者简介:一名运维工作人员。
👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。
🙏创作不易,动动小手给个点赞加关注吧,有什么意见评论区告诉我。

目录

一、剧本(playbook)

1、介绍

2、剧本组成

3、剧本编写规范

4、实战(编写搭建nginx的剧本)

1)本机安装nginx准备配置文件

2) 编写剧本

3)测试并执行剧本

测试剧本

 执行剧本

测试web2的nginx 

 5、使用剧本的变量(部署httpd)

1)本机安装httpd,准备配置文件

2)编写剧本

3)检测脚本

 4)执行剧本

5)使用web浏览器访问web1的9090端口 

 6、handlers

1)更改nginx的配置文件

2)编写剧本

 3)测试剧本

4)运行剧本

 5)使用web浏览器访问web2的8888端口

7、template 

1)准备模板

 2)修改nginx剧本

3)运行剧本并用查看web2的nginx的配置文件

8、tags模块

1)编写剧本(以创建目录为例)

2)运行剧本

3)查看web2主机的/test目录

 二、roles角色扮演

 1、介绍

2、实战(远程配置nginx)

1)目录结构

2)准备目录

3)准备file、template文件

4)编写任务

5)定义变量

6)定义handlers

7)编写剧本

8)测试并运行剧本

9)查看web2的配置文件,并用web浏览器访问web2的8090端口


一、剧本(playbook)

1、介绍

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。

playbook格式:playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

2、剧本组成

剧本的角色(play), 定义的是主机信息
剧本的任务(task), 定义的是具体任务
playbook组成部分:
1) 一个playbook有多个play组成
2) 一个play可以包含多个task任务
3) 简单理解为使用多个模块功能完成一件事

task:

        Variables:变量

        Templates:模板

        Handlers:触发器,当 changed 状态条件满足时,(notify)触发执行的操作。

3、剧本编写规范

编写规范遵循yaml语法规范

缩进规范 两个空格表示一个缩进 不平级标题之间一定要开头相隔两个空格

注意: 缩进只能以空格表示 tab会报错。

字典规范 冒号后面必须要有空格

注意: 冒号结尾时不需要有空格 注释信息中冒号也不需要。

列表规范: 横线后面要有一个空格

4、实战(编写搭建nginx的剧本)

1)本机安装nginx准备配置文件

#安装nginx这里我之前安装好的
[root@localhost ~]# yum install  -y nginx
上次元数据过期检查:0:40:12 前,执行于 2023年07月26日 星期三 08时23分53秒。
软件包 nginx-1:1.22.1-2.el9.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
#创建一个存放nginx配置文件的目录,用作copy到远程服务器使用
[root@localhost ~]# mkdir /nginx
[root@localhost ~]# cp /etc/nginx/nginx.conf /nginx/
#更改nginx的默认端口,用作检测推送
[root@localhost ~]# sed -i '/listen/s/80/8090/g' /nginx/nginx.conf

2) 编写剧本

[root@localhost ~]# vim nginx.yml
[root@localhost ~]# cat nginx.yml 
- hosts: nginxtasks:- name: install nginxyum: name=nginx state=present- name: copy nginx confcopy: src=/nginx/nginx.conf dest=/etc/nginx/nginx.conf- name: start serviceservice: name=nginx state=started enabled=yes

剧本解释:

- hosts:指定需要执行剧本的主机

tasks:任务列表

- name:类似于注释

   ansible模块相关命令

3)测试并执行剧本

ansible-playbook nginx.yml  --syntax-check        检验语法
ansible-playbook nginx.yml --list-tasks        列出任务
ansible-playbook nginx.yml --list-hosts        列出主机
ansible-playbook nginx.yml        执行

测试剧本

#测试剧本语法,无报错即可,报错根据报错提示去修改剧本
[root@localhost ~]# ansible-playbook  nginx.yml --syntax-checkplaybook: nginx.yml
#列出任务列表,展示有哪些任务需要执行
[root@localhost ~]# ansible-playbook nginx.yml  --list-tasksplaybook: nginx.ymlplay #1 (nginx): nginx	TAGS: []tasks:install nginx	TAGS: []copy nginx conf	TAGS: []start service	TAGS: []
#列出需要执行剧本的主机
[root@localhost ~]# ansible-playbook nginx.yml --list-hostsplaybook: nginx.ymlplay #1 (nginx): nginx	TAGS: []pattern: ['nginx']hosts (1):web2

 执行剧本

[root@localhost ~]# ansible-playbook nginx.yml PLAY [nginx] ************************************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************************************
ok: [web2]        #web2可以执行TASK [install nginx] ****************************************************************************************************************************************************
changed: [web2]    #web2安装了nginxTASK [copy nginx conf] **************************************************************************************************************************************************
changed: [web2]    #拷贝配置文件到web2成功TASK [start service] ****************************************************************************************************************************************************
changed: [web2]    #启动nginx成功PLAY RECAP **************************************************************************************************************************************************************
web2                       : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

测试web2的nginx 

用浏览器分别访问web2的80端口和8090端口。

 80端口访问失败。

 8090端口访问成功,说明剧本执行成功,web2的nginx配置文件是刚刚在ansible主机修改的配置文件。

 5、使用剧本的变量(部署httpd)

在剧本中定义变量并使用变量,比如部署软件的时候,将软件的名字和配置文件的路径设置为变量,这样一个剧本只需要更改变量即可完成剧本的复用。

下面在web1使用剧本部署httpd,并且使用变量来测试。

1)本机安装httpd,准备配置文件

思路:准备一个httpd文件夹,将httpd配置文件拷贝到httpd文件夹备用,并且更改配置文件的端口为9090,以便检测远程主机的配置文件是否是推送过去的。

[root@localhost ~]# mkdir /httpd
[root@localhost ~]# cp /etc/httpd/conf/httpd.conf  /httpd/
[root@localhost ~]# sed -i '/^Listen/s/80/9090/g' /httpd/httpd.conf

2)编写剧本

定义变量:

 vars:

      - key:values

引用变量{{key}}

[root@localhost ~]# vim http.yml
[root@localhost ~]# cat http.yml 
- hosts: httpvars:            #定义变量- pkg: httpd    #包名- svc: httpd    #服务名tasks:- name: install httpdyum: name={{pkg}} state=present    #引用包名变量- name: cpoy http confcopy: src=/httpd/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpd serviceservice: name={{svc}} state=started enabled=yes    #引用服务名变量

3)检测脚本

[root@localhost ~]# ansible-playbook http.yml  --syntax-check
[DEPRECATION WARNING]: Specifying a list of dictionaries for vars is deprecated in favor of specifying a dictionary. This feature will be removed in version 2.18. 
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.playbook: http.yml

 4)执行剧本

[root@localhost ~]# ansible-playbook http.yml 
[DEPRECATION WARNING]: Specifying a list of dictionaries for vars is deprecated in favor of specifying a dictionary. This feature will be removed in version 2.18. 
Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.PLAY [http] *************************************************************************************************************************************************************TASK [Gathering Facts] **************************************************************************************************************************************************
ok: [web1]TASK [install httpd] ****************************************************************************************************************************************************
changed: [web1]TASK [copy http conf] ***************************************************************************************************************************************************
changed: [web1]TASK [start httpd service] **********************************************************************************************************************************************
changed: [web1]PLAY RECAP **************************************************************************************************************************************************************
web1                       : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

5)使用web浏览器访问web1的9090端口 

 6、handlers

触发器,当 changed 状态条件满足时,(notify)触发执行的操作。

在需要执行触发器的位置设置

notify:标记

然后在定义触发器

handlers:

 - name:标记

   触发执行命令

注意:notify的标记要和handlers的标记要一致,这里是一一对应的。

在配置文件发生改变的时候,需要重启服务才能生效,所以一般在拷贝配置文件任务那里添加一个notify,在触发器位置执行重启服务器。

这里使用刚刚nginx的剧本来进行测试。

1)更改nginx的配置文件

[root@localhost ~]# sed -i '/listen/s/8090/8888/g' /nginx/nginx.conf

将默认端口改为8888 

2)编写剧本

[root@localhost ~]# vim nginx.yml 
[root@localhost ~]# cat nginx.yml 
- hosts: nginxtasks:- name: install nginxyum: name=nginx state=present- name: copy nginx confcopy: src=/nginx/nginx.conf dest=/etc/nginx/nginx.confnotify: restart nginx service- name: update index.htmlshell: echo 'i am sure' > /usr/share/nginx/html/index.html- name: start serviceservice: name=nginx state=started enabled=yeshandlers:- name: restart nginx serviceservice: name=nginx state=restarted

 3)测试剧本

[root@localhost ~]# ansible-playbook nginx.yml --syntax-checkplaybook: nginx.yml

4)运行剧本

 5)使用web浏览器访问web2的8888端口

 成功!!!

7、template 

可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

1)准备模板

将原本的配置文件重命名改成.j2文件作为配置文件模板。

然后更改模板内容。

在主机清单定义一个变量

[root@localhost ~]# mv /nginx/nginx.conf  /nginx/nginx.conf.j2

 这里将模板文件的listen处改为使用变量ansible_http_port。

 2)修改nginx剧本

- hosts: nginxtasks:- name: install nginxyum: name=nginx state=present- name: nginx conftemplate: src=/nginx/nginx.conf.j2 dest=/etc/nginx/nginx.confnotify: restart nginx service- name: update index.htmlshell: echo 'i  am sure' > /usr/share/nginx/html/index.html- name: start serviceservice: name=nginx state=started enabled=yeshandlers:- name: restart nginx serviceservice: name=nginx state=restarted

将原来的copy改为使用模板来推送配置文件

3)运行剧本并用查看web2的nginx的配置文件

8、tags模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

1)编写剧本(以创建目录为例)

[root@localhost ~]# cat tags.yml 
- hosts: nginxtasks:- name: mkdir dir1file: name=/test/dir1 state=directorytags:- first- name: mkdir dir2file: name=/test/dir2 state=directory- name: nkdir dir3file: name=/test/dir3 state=directorytags:- always

这里给dir1任务打了first的标签 ,给dir2任务没有打标签,给dir3打了always的标签

2)运行剧本

看到运行提示,只有dir1和dir3被创建。

3)查看web2主机的/test目录

[root@localhost ~]# ansible nginx -m shell -a 'ls /test'
web2 | CHANGED | rc=0 >>
dir1
dir3

发现只有dir1和dir3,因为在运行剧本的时候加了tags=“first”所以剧本中只有打first标签的任务和打always的任务被执行,其余任务不会被执行。


 二、roles角色扮演

 1、介绍

roles则是在ansible中,playbooks的目录组织结构。
将代码或文件进行模块化,成为roles的文件目录组织结构,
易读,代码可重用,层次清晰。

2、实战(远程配置nginx)

1)目录结构

结构介绍:

  • nginx 角色名
  • files  普通文件,用来存放由 copy 模块或 script 模块调用的文件。
  • handlers  触发器程序,此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
  • tasks  主任务,此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
  • templates 金甲模板(有变量的文件),用来存放 j2 模板,template 模块会自动在此目录中寻找 j2 模板文件。
  • vars 自定义变量,此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
  • f除开files目录和templates目录不需要创建main.yml文件,其余都要各个目录下都要创建

2)准备目录

mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
[root@localhost ~]# tree roles/
roles/
├── nginx
│   ├── files
│   ├── handlers
│   │   └── main.yaml
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   └── vars
│       └── main.yaml
└── site.yaml6 directories, 4 files

3)准备file、template文件

制作nginx主页,以及金甲模板,并修改模板。

[root@localhost ~]# cp /nginx/nginx.conf.j2  roles/nginx/templates/
[root@localhost ~]# echo "<h1>I am Sure Nginx<h1/>" > roles/nginx/files/index.html
[root@localhost ~]# tree roles/
roles/
├── nginx
│   ├── files
│   │   └── index.html
│   ├── handlers
│   │   └── main.yaml
│   ├── tasks
│   │   └── main.yaml
│   ├── templates
│   │   └── nginx.conf.j2
│   └── vars
│       └── main.yaml
└── site.yaml

4)编写任务

在tasks目录下的main.yaml写

[root@localhost ~]# cat roles/nginx/tasks/main.yaml tasks:- name: install nginxyum: name={{pkg}} state=present- name: set nginx conftemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.confnotify: restart nginx service- name: copy nginx indexcopy: src=index.html dest=/usr/share/nginx/html/index.html- name: start nginx serviceservice: name={{svc}} state=started enabled=yes

5)定义变量

在vars目录下的main.yaml编写。

[root@localhost ~]# cat roles/nginx/vars/main.yaml 
port: 8090
work_connection: 1024
pkg: nginx
svc: nginx

6)定义handlers

在handlers目录下的main.yaml编写。

[root@localhost ~]# cat roles/nginx/handlers/main.yaml 
- name: restart nginx serviceservice: name={{svc}} state=restarted

7)编写剧本

在site.yaml编写

剧本中的角色可以是多个,这里是以一个nginx为例。

[root@localhost ~]# cat roles/site.yaml 
- hosts: nginxroles:- nginx

8)测试并运行剧本

[root@localhost ~]# ansible-playbook roles/site.yaml --syntax-checkplaybook: roles/site.yaml[root@localhost ~]# ansible-playbook roles/site.yaml 
[WARNING]: Found variable using reserved name: portPLAY [nginx] ************************************************************************************************************************************************************TASK [Gathering Facts] **************************************************************************************************************************************************
ok: [web2]TASK [nginx : install nginx] ********************************************************************************************************************************************
ok: [web2]TASK [nginx : set nginx conf] *******************************************************************************************************************************************
changed: [web2]TASK [nginx : copy nginx index] *****************************************************************************************************************************************
changed: [web2]TASK [nginx : start nginx service] **************************************************************************************************************************************
ok: [web2]RUNNING HANDLER [nginx : restart nginx service] *************************************************************************************************************************
changed: [web2]PLAY RECAP **************************************************************************************************************************************************************
web2                       : ok=6    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

9)查看web2的配置文件,并用web浏览器访问web2的8090端口

[root@localhost ~]# ansible nginx -m shell -a 'cat /etc/nginx/nginx.conf | grep listen'
web2 | CHANGED | rc=0 >>listen       8090;listen       [::]:8090;
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
[root@localhost ~]# ansible nginx -m shell -a 'cat /etc/nginx/nginx.conf | grep worker_connection'
web2 | CHANGED | rc=0 >>worker_connections 1024;

web2的nginx的配置文件中发现端口为8090,worker_connections是1024,和刚刚设置的变量一致。 

 访问web2的8090端口展示的页面正是刚刚自己自定义的网络首页。

相关文章:

ansible自动化运维(二)剧本、角色编写实战

&#x1f618;作者简介&#xff1a;一名运维工作人员。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动动小…...

【Spring框架】@Resource注入以及与@Autowired的区别

目录 使用Resource设置name的方式来重命名注入的对象区别 使用Resource设置name的方式来重命名注入的对象 package com;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.spr…...

FTP服务器的搭建和配置上传脚本

文章目录 前言一、配置本地用户可上传权限ftp服务器1、用户登录ftp 二、配置FTP上传脚本文件1.脚本代码如下 补充知识 前言 vsftpd&#xff08;Very Secure FTP Daemon&#xff09;是一个在 Linux/Unix 系统上运行的一款开源免费的 FTP 服务器软件。vsftpd 支持支持 匿名用户、…...

Ubuntu22.04上部署Lua开发环境

需求背景 想在Ubuntu22.04上搭建一下Lua的开发环境&#xff0c;其实步骤比较简单的&#xff0c;此文章也适用于Ubuntu主机环境搭建Lua,如果想在在Ubuntu内部署一个容器&#xff0c;然后在容器内搭建Lua的环境&#xff0c;可以先参考容器的创建过程 ubuntu22.04上如何创建有pri…...

React的hooks---自定义hooks

通过自定义 Hook&#xff0c;可以将组件逻辑提取到可重用的函数中&#xff0c;在 Hook 特性之前&#xff0c;React 中有两种流行的方式来共享组件之间的状态逻辑&#xff1a;render props和高阶组件&#xff0c;但此类解决方案会导致组件树的层级冗余等问题。而自定义 Hook 的使…...

Asp.Net 使用Log4Net (基础版)

Asp.Net 使用Log4Net (基础版) 1. 创建项目 创建ASP.NET Web Forms项目 在Visual Studio中创建一个新的ASP.NET Web Forms项目。命名为"Log4NetDemo"。 2.安装Log4Net包 打开NuGet包管理器控制台&#xff0c;并运行以下命令来安装Log4Net&#xff1a; mathemati…...

STM32 互补PWM 带死区 HAL

1、设置PWM波频率100KHz&#xff0c;占空比50%&#xff0c;死区时间1us 2、 while 循环之前启动PWM HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //启动TIM1_CH1 PWM输出 HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);//启动TIM1_CH1N PWM输出 3、死区计算 DT_time…...

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片

20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片 2023/7/21 22:58 1、前言&#xff1a; AES-128加密的ts视频切片【第一个】&#xff0c;打开有时间限制的&#xff01; https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?typ…...

使用Python实现产品图片自动化处理

大家好&#xff0c;在当今的数字化时代&#xff0c;产品图片在电子商务和市场营销中发挥着至关重要的作用。然而&#xff0c;为在线平台准备产品图片可能是一项耗时的任务&#xff0c;本文将分享一个Python脚本&#xff0c;用于自动化产品图片的图像处理工作流程。通过使用Pyth…...

在CSDN学Golang云原生(git)

一&#xff0c;git的工作流程 Golang的Git工作流程与其他语言的Git工作流程类似&#xff0c;通常包括以下步骤&#xff1a; 创建分支&#xff1a;在本地代码库中创建一个新的分支&#xff0c;该分支用于开发新功能或修复错误。编写代码&#xff1a;在创建的分支上进行编码&am…...

QT多线程编程基础

文章目录 前言一、线程&#xff0c;进程 介绍二、创建线程三、终止线程总结 前言 一、线程&#xff0c;进程 介绍 线程&#xff1a; 是操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源&#xff0c;如内存和文件…...

TRT4-trt-integrate - 3 使用onnxruntime进行onnx的模型推理过程

前言&#xff1a; onnx是microsoft开发的一个中间格式&#xff0c;而onnxruntime简称ort是microsoft为onnx开发的推理引擎。允许使用onnx作为输入进行直接推理得到结果。 py接口的推理过程&#xff1a; main函数&#xff1a; if __name__ "__main__":session onn…...

layui+drogon完成文件上传(简例)

layui界面加入按钮、文本框、进度条&#xff1a; <div class"layui-row"><button type"button" class"layui-btn" id"file_upload_control">文件上传</button><input type"file" id"files_input…...

高精度地图服务引擎项目

技术栈&#xff1a;使用vue3TypeScriptElement PlusPiniaaxios 项目描述&#xff1a;高精度地图服务引擎项目&#xff0c;提供轻量化处理3D瓦片切片分布式处理分发服务的一站式解决方案 工作内容&#xff1a;1、项目60%已上的页面开发 2、部分模块的功能实现&#xff0c; 3、封…...

PyTorch使用Transformer进行机器翻译

文章目录 简介数据集环境要求实验代码实验结果参考来源 简介 本文使用PyTorch自带的transformer层进行机器翻译&#xff1a;从德语翻译为英语。从零开始实现Transformer请参阅PyTorch从零开始实现Transformer&#xff0c;以便于获得对Transfomer更深的理解。 数据集 Multi30…...

LoadRunner使用教程

1. LoadRunner简介 LoadRunner是一款广泛使用的性能测试工具 可以对各种应用程序进行性能测试&#xff0c;包括Web应用程序、移动应用程序、企业级应用程序等。它提供了一个综合的性能测试解决方案&#xff0c;包括测试计划设计、脚本录制、测试执行、结果分析和报告生成等功…...

Zia和ChatGPT如何协同工作?

有没有集成ChatGPT的CRM系统推荐&#xff1f;Zoho CRM已经正式与ChatGPT集成。下面我们将从使用场景、使用价值和使用范围等方面切入讲述CRMAI的应用和作用。 Zia和ChatGPT如何协同工作&#xff1f; Zia和ChatGPT是不同的人工智能模型&#xff0c;在CRM中呈现出共生的关系。 …...

【位操作】——获取整数变量最低位为 1 的位置

获取整数变量最低位为 1 的位置 #define BIT_LOW_BIT(y) (((y)&BIT(0)) ? 0 : (((y)&BIT(1)) ? 1 : (((y)&BIT(2)) ? 2 : (((y)&BIT(3)) ? 3 : \(((y)&BIT(4)) ? 4 : (((y)&BIT(5)) ? 5 : (((y)&BIT(6)) ? 6 : (((y)&…...

gtest测试用例注册及自动化调度机制源代码流程分析

gtest的入门参见&#xff1a; 玩转Google开源C单元测试框架Google Test系列(gtest) gtest源码分析流程参见&#xff1a; gtest流程解析 测试用例注册流程分析要点&#xff1a;TEST_F宏替换、C静态成员的动态初始化。 自动化调度流程分析要点&#xff1a;UnitTest、UnitTestIm…...

IOS自动化测试环境搭建教程

目录 一、前言 二、环境依赖 1、环境依赖项 2、环境需求与支持 三、环境配置 1、xcode安装 2、Git安装 3、Homebrew安装&#xff08;用brew来安装依赖&#xff09; 4、npm和nodejs安装 5、libimobiledevice安装 6、idevicesinstaller安装 7、ios-deploy安装 8、Ca…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...