Ansible playbook自动化运维工具详解
Ansible playbook自动化运维工具详解
- 一、playbook的相关知识
- 1.1、playbook 的简介
- 1.2、playbook的 各部分组成
- 二、基础的playbook剧本编写实例
- 三、 playbook的定义、引用变量
- 3.1、基础变量的定义与引用
- 3.2、引用fact信息中的变量
- 四、playbook中的when条件判断和变量循环使用
- 4.1、when条件判断
- 4.2、变量循环
- 五、Templates 模块
- cd /etc/ansible #在ansible的所在目录中创建该项目的目录 mkdir apache vim apache.yaml
- vim nginx.yaml
- vim test1.yaml
- vim test2.yaml
- vim test3.yaml
- vim test3.yaml
- 4.2 变量循环 (1)with_item 单循环输出 vim test4.yaml
- vim test4.yaml
- (2) with_list 每组列表一起循环的输出
- (3) with_together 同一列表位置数据组合输出的循环
- (4) with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)
- 五、Templates 模块
- 六、Tags
- 6.1 单标签的使用
- 6.2、多标签的运用
- 6.3、通用标签always的运用
一、playbook的相关知识
1.1、playbook 的简介
- playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。
- 简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。
- Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。
- 而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。
1.2、playbook的 各部分组成
- Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
- Variables:变量
- Templates:模板
- Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
- Roles:角色
二、基础的playbook剧本编写实例
playbook中运用的模块就是ansible中的模块,就像docker-compose一样将docker操作容器的指令归纳为一个yaml文件,开启运行yaml中的指令模块就能按照预设计的方向去完成。
实例1:playbook编写 apache的yum安装部署剧本
剧本编写实现的需求:对Ansible管理的所有的webservers组的成员,yum安装最新版本的apache服务软件,并进行相应环境的调整,确保webservers的apache服务能够正常运行并设置开机自启
cd /etc/ansible #在ansible的所在目录中创建该项目的目录
mkdir apache
vim apache.yaml
---
- name: apache yum applygather_facts: falsehosts: webserversremote_user: roottasks:- name: test connectionping:- name: stop firewalldservice: name=firewalld state=stopped- name: stop selinuxcommand: '/usr/sbin/setenforce 0'ignore_errors: true- name: yum install apache serviceyum: name=httpd state=latest- name: start apache serviceservice: name=httpd state=started enabled=yes

运行剧本的方法:
//运行playbook
ansible-playbook apache.yaml//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook apache.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook apache.yaml --list-task #检查tasks任务
ansible-playbook apache.yaml --list-hosts #检查生效的主机
ansible-playbook apache.yaml --start-at-task='install httpd' #指定从某个task开始运行


实例2:playbook编写nginx 的yum安装并且能修改其监听端口的剧本
需求:通过yum安装nginx服务,并且能够控制被管理的主机的服务的开启,按照预设的配置在运行时的端口。在编写剧本前,需要准备相应的两个文件,一个为nginx的yum源。一个为相对应的主配置文件,在主配置文件中修改其端口,在将该配置移至被管理主机中,作为运行启动时的默认配置


剧本编写:
mkdir /etc/ansible/nginxvim nginx.yaml
---
- name: nginx scriptgather_facts: falsehosts: webserversremote_user: roottasks:- name: test connectionping:- name: stop firewalldservice: name=firewalld state=stopped enabled=no- name: stop selinuxcommand: '/usr/sbin/setenforce 0'ignore_errors: true- name: prepare nginx repocopy: src=/etc/ansible/nginx/nginx.repo dest=/etc/yum.repos.d/nginx.repo- name: install nginxyum: name=nginx state=latest- name: change portcopy: src=/opt/default.conf dest=/etc/nginx/conf.d/default.confnotify: "restart nginx"- name: start nginxservice: name=nginx state=started enabled=yeshandlers:- name: restart nginxservice: name=nginx state=restarted

运行结果:


三、 playbook的定义、引用变量
3.1、基础变量的定义与引用
在yaml文件中,我们可以在初始配置的模块中用var去定义变量的存在,变量的格式为key:value,以此来确定该变量在剧本中的存在
vim test1.yaml
---
- name: this is a play for testing variableshosts: dbserversremote_user: rootvars:filename: abc.txttasks:- name: touch a test filefile: path=/opt/{{filename}} state=touchansible-playbook test1.yaml



3.2、引用fact信息中的变量
首先我们知道 使用 ansible 组 -m setup 可以收集该组中所有的节点信息 ,所以setup中fact'信息,有时候会剧本编写中需要,而fact的信息也是可以通过变量的方式进行调用

剧本编写:
vim test2.yaml
---
- name: this is a playbook for quote variatehosts: dbserversremote_user: roottasks:- name: reading setup fact variatedebug: msg={{ansible_date_time.weekday}}
~

运行的结果:

四、playbook中的when条件判断和变量循环使用
4.1、when条件判断
#选用filter=ansible_default_ipv4中的address作为when条件进行测试
ansible all -m setup -a 'filter=ansible_default_ipv4'

测试剧本编写:
vim test3.yaml
---
- name: this is when test playbookhosts: allremote_user: roottasks:- name: test whendebug: msg='判断位置'when: ansible_default_ipv4.address == "192.168.73.107"ansible-playbook test3.yaml

4.2、变量循环
with_item 单循环输出
vim test4.yaml
---
- name: item testhosts: dbserversremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_items: [a, b, c, d]ansible-playbook test4.yaml

with_list 每组列表一起循环的输出
---
- name: item testhosts: dbserversremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_list:- [a, b, c, d]- [1 ,2, 3, 4]
~
~

with_together 同一列表位置数据组合输出的循环
---
- name: item testhosts: dbserversremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_together:- [a, b, c, d]- [1 ,2, 3, 4]
~

with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)
---
- name: item testhosts: dbserversremote_user: rootgather_facts: notasks:- debug:msg: "{{item}}"with_nested:- [a, b, c, d]- [1 ,2, 3, 4]
~

四种迭代循环方式的总结
-
whith_items: {{item}}会把所有的列表展开进行遍历输出,with_flattened也可以替代with_items
-
with_list: {{item}}会把每个列表当作一个整体输出。如果每个列表中只有一个值,则效果与with items一致。loop也可以替代ith
-
with_together: {{item}}引用时会把每个列表相同位置的值对齐合并后输出
-
with nested:{ {item}}引用时会把每个列表的值两两组合循环输出
五、Templates 模块
linux自动化运维
同时被 2 个专栏收录
8 篇文章1 订阅
订阅专栏
Linux软件使用
10 篇文章1 订阅
订阅专栏
内容预知
目录
内容预知
1.playbook的相关知识
1.1 playbook 的简介
1.2 playbook的 各部分组成
- 基础的playbook剧本编写实例
实例1:playbook编写 apache的yum安装部署剧本
实例2:playbook编写nginx 的yum安装并且能修改其监听端口的剧本
- playbook的定义、引用变量
3.1 基础变量的定义与引用
3.2 引用fact信息中的变量
- playbook中的when条件判断和变量循环使用
4.1 when条件判断
4.2 变量循环
(1)with_item 单循环输出
(2) with_list 每组列表一起循环的输出
(3) with_together 同一列表位置数据组合输出的循环
(4) with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)
四种迭代循环方式的总结
- Templates 模块
(1)先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
(2) 修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
(3) 编写 playbook
- Tags
6.1 单标签的使用
6.2 多标签的运用
6.3 通用标签always的运用
- roles
1.playbook的相关知识
1.1 playbook 的简介
playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。
对于YAML文件格式的编写,我在之前的博客就有所介绍:
【云原生】Docker-compose单机容器集群编排_站在这别动,我去给你买橘子的博客-CSDN博客
https://blog.csdn.net/qq_62462797/article/details/128052363?spm=1001.2014.3001.5501
1.2 playbook的 各部分组成
(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色
- 基础的playbook剧本编写实例
playbook中运用的模块就是ansible中的模块,就像docker-compose一样将docker操作容器的指令归纳为一个yaml文件,开启运行yaml中的指令模块就能按照预设计的方向去完成。
实例1:playbook编写 apache的yum安装部署剧本
剧本编写实现的需求:对Ansible管理的所有的webservers组的成员,yum安装最新版本的apache服务软件,并进行相应环境的调整,确保webservers的apache服务能够正常运行并设置开机自启
cd /etc/ansible #在ansible的所在目录中创建该项目的目录
mkdir apache
vim apache.yaml
- name: apache yum apply
gather_facts: false
hosts: webservers
remote_user: root
tasks:-
name: test connection
ping: -
name: stop firewalld
service: name=firewalld state=stopped -
name: stop selinux
command: ‘/usr/sbin/setenforce 0’
ignore_errors: true -
name: yum install apache service
yum: name=httpd state=latest -
name: start apache service
service: name=httpd state=started enabled=yes
-
运行剧本的方法:
//运行playbook
ansible-playbook apache.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook apache.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook apache.yaml --list-task #检查tasks任务
ansible-playbook apache.yaml --list-hosts #检查生效的主机
ansible-playbook apache.yaml --start-at-task=‘install httpd’ #指定从某个task开始运行
实例2:playbook编写nginx 的yum安装并且能修改其监听端口的剧本
需求:通过yum安装nginx服务,并且能够控制被管理的主机的服务的开启,按照预设的配置在运行时的端口。
在编写剧本前,需要准备相应的两个文件,一个为nginx的yum源。一个为相对应的主配置文件,在主配置文件中修改其端口,在将该配置移至被管理主机中,作为运行启动时的默认配置
剧本编写:
mkdir /etc/ansible/nginx
vim nginx.yaml
-
name: nginx script
gather_facts: false
hosts: webservers
remote_user: root
tasks:-
name: test connection
ping: -
name: stop firewalld
service: name=firewalld state=stopped enabled=no -
name: stop selinux
command: ‘/usr/sbin/setenforce 0’
ignore_errors: true -
name: prepare nginx repo
copy: src=/etc/ansible/nginx/nginx.repo dest=/etc/yum.repos.d/nginx.repo -
name: install nginx
yum: name=nginx state=latest -
name: change port
copy: src=/opt/default.conf dest=/etc/nginx/conf.d/default.conf
notify: “restart nginx” -
name: start nginx
service: name=nginx state=started enabled=yes
handlers:
- name: restart nginx
service: name=nginx state=restarted
-
运行结果:
- playbook的定义、引用变量
3.1 基础变量的定义与引用
在yaml文件中,我们可以在初始配置的模块中用var去定义变量的存在,变量的格式为key:value,以此来确定该变量在剧本中的存在
vim test1.yaml
- name: this is a play for testing variables
hosts: dbservers
remote_user: root
vars:
filename: abc.txt
tasks:- name: touch a test file
file: path=/opt/{{filename}} state=touch
- name: touch a test file
ansible-playbook test1.yaml
3.2 引用fact信息中的变量
首先我们知道 使用 ansible 组 -m setup 可以收集该组中所有的节点信息 ,
所以setup中fact’信息,有时候会剧本编写中需要,而fact的信息也是可以通过变量的方式进行调用
剧本编写:
vim test2.yaml
- name: this is a playbook for quote variate
hosts: dbservers
remote_user: root
tasks:- name: reading setup fact variate
debug: msg={{ansible_date_time.weekday}}
~
- name: reading setup fact variate
运行的结果:
- playbook中的when条件判断和变量循环使用
4.1 when条件判断
#选用filter=ansible_default_ipv4中的address作为when条件进行测试
ansible all -m setup -a ‘filter=ansible_default_ipv4’
测试剧本编写:
vim test3.yaml
- name: this is when test playbook
hosts: all
remote_user: root
tasks:- name: test when
debug: msg=‘判断位置’
when: ansible_default_ipv4.address == “192.168.73.107”
- name: test when
ansible-playbook test3.yaml
除此之外 when条件还可以通过 !=(不等于条件来进行判断)
vim test3.yaml
- name: this is when test playbook
hosts: all
remote_user: root
tasks:- name: test when
debug: msg=‘判断位置’
when: ansible_default_ipv4.address != “192.168.73.107”
ansible-playbook test3.yaml
- name: test when
4.2 变量循环
(1)with_item 单循环输出
vim test4.yaml
- name: item test
hosts: dbservers
remote_user: root
gather_facts: no
tasks:- debug:
msg: “{{item}}”
with_items: [a, b, c, d]
- debug:
ansible-playbook test4.yaml
当列表为两个时。with_item的输出方式:
vim test4.yaml
- name: item test
hosts: dbservers
remote_user: root
gather_facts: no
tasks:- debug:
msg: “{{item}}”
with_items:- [a, b, c, d]
- [1 ,2, 3, 4]
ansible-playbook test4.yaml
- debug:
(2) with_list 每组列表一起循环的输出
- name: item test
hosts: dbservers
remote_user: root
gather_facts: no
tasks:- debug:
msg: “{{item}}”
with_list:- [a, b, c, d]
- [1 ,2, 3, 4]
~
~
- debug:
(3) with_together 同一列表位置数据组合输出的循环
- name: item test
hosts: dbservers
remote_user: root
gather_facts: no
tasks:- debug:
msg: “{{item}}”
with_together:- [a, b, c, d]
- [1 ,2, 3, 4]
~
- debug:
- name: item test
hosts: dbservers
remote_user: root
gather_facts: no
tasks:- debug:
msg: “{{item}}”
with_together:- [a, b, c, d]
- [1 ,2, 3, 4]
- [A, B, C]
- debug:
(4) with_nested 列表数据循环匹配的循环(根据列表个数定义有多少层的循环)
- name: item test
hosts: dbservers
remote_user: root
gather_facts: no
tasks:- debug:
msg: “{{item}}”
with_nested:- [a, b, c, d]
- [1 ,2, 3, 4]
~
- debug:
四种迭代循环方式的总结
whith_items: {{item}}会把所有的列表展开进行遍历输出,with_flattened也可以替代with_items
with_list: {{item}}会把每个列表当作一个整体输出。如果每个列表中只有一个值,则效果与with items一致。loop也可以替代ith
with_together: {{item}}引用时会把每个列表相同位置的值对齐合并后输出
with nested:{ {item}}引用时会把每个列表的值两两组合循环输出
五、Templates 模块
-
Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
-
本次我们以改变apche的配置文件为例,来展现Templates模块的运用
先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
#如果没有相关的httpd的配置文件,可以先yum按住一个httpd的服务,取其主配置文件
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts
[webservers]
192.168.73.106 http_port=192.168.73.106:80 server_name=www.test1.com:80 root_dir=/etc/httpd/htdocs[dbservers]
192.168.73.107 http_port=192.168.73.107:80 server_name=www.test2.com:80 root_dir=/etc/httpd/htdocs

此外如果没有做DNS解析域名,还需要对主机名进行映射 :
vim /etc/hosts192.168.73.106 www.test1.com
192.168.73.107 www.test2.com
编写 playbook
mkdir /etc/ansible/templates
vim apache.yaml
---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: create root dirfile: path=/etc/httpd/htdocs state=directory- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restartedansiable-playbook apache.yaml



六、Tags
- 可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
- playbook还提供了一个特殊的tags为always。作用就是当使用always作为tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
6.1 单标签的使用
vim test1.yaml
---
- name: this is a play for testing variableshosts: dbserversremote_user: rootvars:filename: abc.txttasks:- name: position 1debug:msg: 'ls /opt'tags:- only- name: position 2debug:msg: 'ls /mnt'ansible-playbook test1.yaml --tags="only"

6.2、多标签的运用
---
- name: this is a play for testing variableshosts: dbserversremote_user: rootvars:filename: abc.txttasks:- name: position 1debug:msg: '测试标签1'tags:- one- name: position 2debug:msg: '测试标签2'tags:- two- name: position 3debug:msg: '测试标签3'tags:- one

执行结果:

6.3、通用标签always的运用
---
- name: this is a play for testing variableshosts: dbserversremote_user: rootvars:filename: abc.txttasks:- name: position 1debug:msg: '测试标签1'tags:- one- name: position 2debug:msg: '测试通用标签always'tags:- always- name: position 3debug:msg: '测试标签3'tags:- one

执行结果:

相关文章:
Ansible playbook自动化运维工具详解
Ansible playbook自动化运维工具详解 一、playbook的相关知识1.1、playbook 的简介1.2、playbook的 各部分组成 二、基础的playbook剧本编写实例三、 playbook的定义、引用变量3.1、基础变量的定义与引用3.2、引用fact信息中的变量 四、playbook中的when条件判断和变量循环使用…...
图像切分:将一张长图片切分为指定长宽的多张图片
1.需求 比如有一张很长的图片其大小为宽度779,高度为122552,那我想把图片切分为779乘以1280的格式。 步骤如下: 使用图像处理库(如PIL或OpenCV)加载原始图片。确定子图片的宽度和高度。计算原始图片的宽度和高度&am…...
ROS学习笔记(5):ros_control
1.ros_control简介 ros_control - ROS Wiki ros_control是为ROS提供的机器人控制包,包含一系列控制器接口、传动装置接口、控制器工具箱等,有效帮助机器人应用功能包快速落地,提高开发效率。 2.ros_control框架 ros_control总体框架: 针对…...
《008.Springboot+vue之自习室选座系统》
[火]《008.Springbootvue之自习室选座系统》 项目简介 [1]本系统涉及到的技术主要如下: 推荐环境配置:DEA jdk1.8 Maven MySQL 前后端分离; 后台:SpringBootMybatisredis; 前台:vueElementUI; [2]功能模块展示: 前端…...
道可云元宇宙每日资讯|5G数智新时代元宇宙发展论坛在厦门举办
道可云元宇宙每日简报(2023年11月6日)讯,今日元宇宙新鲜事有: 5G数智新时代元宇宙发展论坛在厦门举办 3日,由2023年中国金鸡百花电影节执委会主办、厦门电影节有限公司协办的“5G数智新时代元宇宙发展论坛暨‘中国白德…...
使用 Go 写入文件
在本教程中,我们将学习如何使用 Go 将数据写入文件。我们还将学习如何同时写入文件。 本教程有以下部分 将字符串写入文件将字节写入文件逐行将数据写入文件附加到文件同时写入文件 由于 Playground 不支持文件操作,请在本地系统中运行本教程的所有程…...
调用DeleteLocalRef的正确姿势
做安卓jni相关开发的总会在涉及到jni变量释放时怀疑人生,what? where? when? who? why? how? how much? 最近碰到一个比较奇怪的问题,有一个jni方法的耗时在随着调用次数的增加而上涨,但是没有明显的内存泄漏,经过我缜密分…...
抖音小店从0到1起店流程,实操经验分享!
我是电商珠珠 很多人在开店之后,并不知道怎么做。往往会有人跑来问我说,开店之后怎么做啊,流程方面我还不是很熟悉啊等等。 这份起店流程备好了,将来对你有用。 第一步,店铺基础设置 在店铺开好之后,不…...
MySQL权限
权限 MySQL 允许客户端用户连接到服务器并访问服务器管理数据,MySQL 用户权限系统的主要功能是对给定主机连接的用户进行身份验证,并将该用户与数据库的权限相关联。 在 MySQL8 之前,授权表使用 MyISAM 并且是非事务性的,在 MyS…...
Nginx服务器安装证书并启用SSL(acme.sh)
前提 您已购置vps服务器,例如阿里云全球站ecs、AWS EC2、Azure VM、GCP Compute等安全组已开启80、443端口,且访问源设置为0.0.0.0/0域名已设置A记录指向当前操作服务器,若您使用aws ec2,有公有 IPv4 DNS,可供使用 安…...
c++实现观察者模式
前言 我觉得这是最有意思的模式,其中一个动,另外的自动跟着动。发布-订阅,我觉得很巧妙。 代码 头文件 #pragma once #include<vector> #include<string> #include<iostream>// 抽象观察者 class Aobserver { public:v…...
C 语言左移位操作在kernel驱动子系统中的特殊用途
文章目录 前言一、C语言左移位操作介绍1. 左移位二、左移位操作在kernel 驱动子系统中的应用1. 左移位操作在 V4L2, Media 子系统中的应用实例2.左移位操作在 DRM 子系统中的应用实例2.1 左移位操作在struct drm_crtc 中的应用2.2 左移位操作在struct drm_encoder 中的应用总结…...
kafka3.6.0集群部署
环境准备 机器环境 系统主机名IP地址centos7.9kafka01192.168.200.51centos7.9kafka02192.168.200.52centos7.9kafka03192.168.200.53 所需软件 jdk-8u171-linux-x64.tar.gzapache-zookeeper-3.8.3-bin.tar.gz https://dlcdn.apache.org/zookeeper/zookeeper-3.8.3/apache-zook…...
JAVA客户端使用账号密码调用influxdb2报错:{“code“:“unauthorized“,“message“:“Unauthorized“}
问题:JAVA客户端访问influxdb2报错 说明:当前influxdb版本:2.6.1 使用依赖: <dependency><groupId>org.influxdb</groupId><artifactId>influxdb-java</artifactId><version>2.10</vers…...
Mysql查询今天到期、n天即将到期、还有n天过期相关sql
超级治愈的一段话 其实你已经很幸福了,吃饱穿暖,没病没灾,隔三岔五还能吃顿好的,偶尔还能睡到自然醒,肥嘟嘟的一身福气。人这一辈子,要是能够逃过天灾,躲过战乱,不遇歹人,不生大病,就已经是非常幸运了,要是还能家庭和谐,收人稳定,三五知己,那更是天大的福泽。 -…...
【漏洞复现】Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、深度利用1、反弹Shell 说明内容漏洞编号CVE-2017-5645漏洞名称Log4j Server …...
【江协科技-用0.96寸OLED播放知名艺人打篮球视频】
Python进行视频图像处理,通过串口发送给stm32,stm32接收数据,刷新OLED进行显示。 步骤: 1.按照接线图连接好硬件 2.把Keil工程的代码下载到STM32中 3.运行Python代码,通过串口把处理后的数据发送给STM32进行显示 …...
CATIA环境编辑器用不了时创建项目快捷方式
CATIA环境编辑器用不了时创建项目快捷方式 一、参考适用情况示例二、 解决步骤(一) 先正确放置winb_64部署包(二) 添加环境文件(三) 修改加入的环境文件(四) 复制本机CATIA快捷方式后重命名(五) 修改快捷方式目标的值 一、参考适用情况示例 二、 解决步骤 (一) 先正确放置winb…...
java泛型的深入 泛型还可以在很多地方进行定义 泛型类 泛型方法 泛型接口 泛型的继承和通配符 泛型类练习
文章目录 泛型的深入泛型还可以在很多地方进行定义泛型类泛型方法泛型接口 泛型的继承和通配符泛型类练习总结 泛型的深入 public static void main(String[] args) {//在没有泛型的时候怎么存储数据ArrayList listnew ArrayList();list.add(1);list.add("abc");//遍…...
持续交付的好处
在软件领域,持续交付就是这样一种开发实践,它为所有利益相关者带来好处:开发、运营、测试人员和业务团队。持续交付适用于每个由软件驱动的组织;很难想象企业不使用软件。 它使人们受益,并需要人们做出改变才能更好地…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
