自动化运维:Ansible之playbook基于ROLES部署LNMP平台

news2024/11/27 8:26:56

目录

一、理论

1.playbook剧本

2.ROLES角色

3.关系

4.Roles模块搭建LNMP架构

二、实验

1.Roles模块搭建LNMP架构

三、问题

1.剧本启动php报错语法问题

2.剧本启动mysql报错语法问题

3.剧本启动nginx开启失败

4.剧本安装php失败

5.使用yum时报错

6.rpm -Uvh https://xxxx.rpm 提示连接失败问题

7.依赖检测失败

8.剧本修改php失败

9.剧本启动php失败

10.剧本修改mysql脚本文件失败


一、理论

1.playbook剧本

(1)架构

vim  XXX.yaml
- name:                      #指定play名称
  hosts:                     #指定主机组
  remote_user:               #执行用户 
  gather_facts: true|false   #是否收集远程主机facts信息
  vars:                      #定义变量
  tasks:                     #定义task任务列表
  - name:                 #定义task任务名称
    模块:                 #定义任务使用的模块和参数
    with_items:           #定义循环列表
    when:                 #定义判断条件(== != >= > <= <),true则执行任务,否则不执行任务
	ignore_errors: true   #忽略任务失败
    notify:               #定义task任务changed状态时触发的任务名
    tags:                 #指定标签,ansible-playbook --tags 仅执行拥有指定 tags 标签的任务(always标签总会执行)
  handlers:                  #定义notify触发的任务列表

(2)核心元素

 (3)参数

2.ROLES角色

(1)重构思路

用roles和不用roles的逻辑其实是一样的,要根据服务器的功能,先收集服务器所需要的文件,再进行安装,传输文件,启动服务或重启服务等操作。只是我们这次不必担心命名问题,因为不同的服务或不同功能的服务器所需要的配置文件会被放到不同的目录,不会冲突。

roles这个角色,可以根据同类服务器的功能定义,也可以通过服务去定义,因为我们是一键部署所有服务和项目,也不存在指定部署服务的需求,如果通过服务来定义,也容易出现需要很多when判断的情况,如果用同类功能的服务器定义角色,可能会出现同一条命令需要反复编写的情况,自行选择,我采取根据同类功能服务器去定义我们的roles角色。

(2)目录结构

(3)目录说明

3.关系

playbook是是由一系列的play组成, 每个play由一个或者多个task组成, 一个task一般是一个ansible module, 三者的关系示意图如下:

4.Roles模块搭建LNMP架构


(1)规划

通过ansible的roles角色去配置lnmp环境,nginx、php、mysql都使用源码编译安装

(2)架构

 (3)部署Nginx角色

创建nginx角色所需要的工作目录:

mkdir -p /etc/ansible/playbook/roles/nginx
mkdir -p /etc/ansible/playbook/roles/nginx/defaults
mkdir -p /etc/ansible/playbook/roles/nginx/files
mkdir -p /etc/ansible/playbook/roles/nginx/handlers
mkdir -p /etc/ansible/playbook/roles/nginx/meta
mkdir -p /etc/ansible/playbook/roles/nginx/tasks
mkdir -p /etc/ansible/playbook/roles/nginx/templates
mkdir -p /etc/ansible/playbook/roles/nginx/vars

制作/etc/ansible/playbook/roles/nginx/files/index.php网页目录:

vim /etc/ansible/playbook/roles/nginx/files/index.php

<?php
phpinfo();
?>

制作/etc/ansible/playbook/roles/nginx/files/nginx.repo源:

vim /etc/ansible/playbook/roles/nginx/files/nginx.repo
# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

制作/etc/ansible/playbook/roles/nginx/handlers/main.yml文件,加载nginx的配置模板文件:

vim /etc/ansible/playbook/roles/nginx/handlers/main.yml
- name: reload nginx
  service: name={{service}}  state=reloaded

制作/etc/ansible/playbook/roles/nginx/tasks/init.yml文件:

vim /etc/ansible/playbook/roles/nginx/tasks/init.yml
- name: disable firewalld
  service: name=firewalld  state=stopped  enabled=no
  ignore_errors: True

- name: disable selinux
  shell: "/usr/sbin/setenforce 0"
  ignore_errors: true

制作/etc/ansible/playbook/roles/nginx/tasks/main.yml文件:

- include: "init.yml"

- name: copy nginx yum repo file
  copy: src=nginx.repo  dest=/etc/yum.repos.d/

- name: install nginx
  yum: name={{pkg}}  state=latest

- name: copy index.php
  copy: src=index.php  dest={{root_dir}}

- name: copy nginx template configuration file
  template: src=default.conf.j2  dest=/etc/nginx/conf.d/default.conf
  notify: reload nginx

- name: start nginx
  service: name={{service}} state=started enabled=yes

制作/etc/ansible/playbook/roles/nginx/templates/default.conf.j2模板文:

vim /etc/ansible/playbook/roles/nginx/templates/default.conf.j2 

---修改2到8行-----------
       listen       {{http_port}};
       server_name  {{http_hostname}};
 
       #access_log  /var/log/nginx/host.access.log  main;
 
     location / {
         root   {{root_dir}};

---修改29到36行-----------
    location ~ \.php$ {
         root           {{root_dir}};
         fastcgi_pass   {{http_remote}};
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME  {{root_dir}}$fastcgi_script_name;
        include        fastcgi_params;
     }

制作/etc/ansible/playbook/roles/nginx/vars/main.yml文件:

http_port: 192.168.204.69:80
http_hostname: www.david.com
root_dir: /usr/share/nginx/html
http_remote: 192.168.204.100:9000
pkg: nginx
service: nginx

(4) 部署PHP角色

创建php角色所需要的工作目录:

mkdir -p /etc/ansible/playbook/roles/php
mkdir -p /etc/ansible/playbook/roles/php/defaults
mkdir -p /etc/ansible/playbook/roles/php/files
mkdir -p /etc/ansible/playbook/roles/php/handlers
mkdir -p /etc/ansible/playbook/roles/php/meta
mkdir -p /etc/ansible/playbook/roles/php/tasks
mkdir -p /etc/ansible/playbook/roles/php/templates
mkdir -p /etc/ansible/playbook/roles/php/vars

制作/etc/ansible/playbook/roles/php/files/index.php的网页文件:

vim /etc/ansible/playbook/roles/php/files/index.php 

<?php
phpinfo();
?>

制作/etc/ansible/playbook/roles/php/handlers/main.yml文件:

vim /etc/ansible/playbook/roles/php/handlers/main.yml 

- name: reload php
  service: name={{service}} state=reloaded

制作/etc/ansible/playbook/roles/php/tasks/main.yml文件:

/etc/ansible/playbook/roles/php/tasks]# vim main.yml 

- name: install yum repo
  shell: "rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm"
  ignore_errors: True

- name: install php
  command: 'yum install -y php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml p    hp72w-fpm php72w-mysqlnd php72w-opcache --skip-broken'

- name: create php user
  user: name={{user_name}}

- name: crate web root dir
  file: name={{root_dir}} state=directory

- name: copy index.php
  copy: src=index.php dest={{root_dir}}

- name: modify php configuration file
  replace: path=/etc/php.ini  regexp=";date.timezone ="  replace="date.timezone = Asia/Shanghai"
  notify: reload php

- name: modify username and groupname in www.conf
  replace: path=/etc/php-fpm.d/www.conf  regexp="apache"  replace="{{user_name}}"
    notify: reload php

- name: modify listen addr in www.conf
  replace: path=/etc/php-fpm.d/www.conf  regexp="127.0.0.1:9000"  replace="{{http_port}}"
  notify: reload php

- name: modify allowed client in www.conf
  replace: path=/etc/php-fpm.d/www.conf  regexp="127.0.0.1"  replace="{{remote_addr}}"
  notify: reload php

- name: start php
  service: name={{service}} state=started enabled=yes

制作/etc/ansible/playbook/roles/php/vars/main.yml文件:

vim /etc/ansible/playbook/roles/php/vars/main.yml 

timezone: Asia/Shanghai
user_name: php
http_port: 192.168.204.100:9000
remote_addr: 192.168.204.69
root_dir: /usr/share/nginx/html
service: php-fpm

(5) 部署MySQL角色

创建mysql角色所需要的工作目录:

mkdir -p /etc/ansible/playbook/roles/mysql
mkdir -p /etc/ansible/playbook/roles/mysql/defaults
mkdir -p /etc/ansible/playbook/roles/mysql/files
mkdir -p /etc/ansible/playbook/roles/mysql/handlers
mkdir -p /etc/ansible/playbook/roles/mysql/meta
mkdir -p /etc/ansible/playbook/roles/mysql/tasks
mkdir -p /etc/ansible/playbook/roles/mysql/templates
mkdir -p /etc/ansible/playbook/roles/mysql/vars

制作/etc/ansible/playbook/roles/mysql/handlers/main.yml文件:

vim /etc/ansible/playbook/roles/mysql/handlers/main.yml 

- name: reload mysql
  service: name={{service}} state=reloaded

制作/etc/ansible/playbook/roles/mysql/tasks/main.yml文件:

vim /etc/ansible/playbook/roles/mysql/tasks/main.yml 

- name: remove mariadb
  shell: yum remove mariadb* -y
  ignore_errors: True

- name: install yum repo
  shell: "wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm --force --nodeps && rpm -ivh mysql57-commu    nity-release-el7-11.noarch.rpm --force --nodeps"
  ignore_errors: True

- name: modify gpgcheck
  replace: path=/etc/yum.repos.d/mysql-community.repo  regexp="gpgcheck=1"  replace="gpgcheck=0"

- name: install mysql
  yum: name=mysql-server state=latest

- name: start mysql
  service: name={{service}} state=started enabled=yes

- name: make passwd.sh
  script: /etc/ansible/playbook/roles/mysql/files/passwd.sh

制作/etc/ansible/playbook/roles/mysql/vars/main.yml文件:

vim /etc/ansible/playbook/roles/mysql/vars/main.yml 

service: mysqld.service

(5)启动安装分布式LNMP

vim /etc/ansible/playbook/lnmp.yml 

- name: nginx play
  hosts: webservers
  remote_user: root
  roles:
  - nginx

- name: php play
  hosts: phpservers
  remote_user: root
  roles:
  - php


- name: mysql play
  hosts: mysqlservers
  remote_user: root
  roles:
  - mysql

二、实验


1.Roles模块搭建LNMP架构

(1)环境

表1 主机

主控端192.168.204.199ansible
受控端-1192.168.204.69nginx
受控端-2192.168.204.186mysql
受控端-3192.168.204.100php

(2) 配置主机

 

 (3)部署Nginx角色

创建nginx角色所需要的工作目录:

 

制作/etc/ansible/playbook/roles/nginx/files/index.php网页目录:

 制作/etc/ansible/playbook/roles/nginx/files/nginx.repo源:

制作/etc/ansible/playbook/roles/nginx/handlers/main.yml文件,加载nginx的配置模板文件:

 制作/etc/ansible/playbook/roles/nginx/tasks/init.yml文件:

制作/etc/ansible/playbook/roles/nginx/tasks/main.yml文件:

制作/etc/ansible/playbook/roles/nginx/templates/default.conf.j2模板文:

 制作/etc/ansible/playbook/roles/nginx/vars/main.yml文件:

(4) 部署PHP角色

创建php角色所需要的工作目录:

 

制作/etc/ansible/playbook/roles/php/files/index.php的网页文件:

 制作/etc/ansible/playbook/roles/php/handlers/main.yml文件:

制作/etc/ansible/playbook/roles/php/tasks/main.yml文件:

 

制作/etc/ansible/playbook/roles/php/vars/main.yml文件:

(5) 部署MySQL角色

创建mysql角色所需要的工作目录:

 ​​​​​​​注意:需要提前创建passwd.sh

 制作/etc/ansible/playbook/roles/mysql/handlers/main.yml文件:

  制作/etc/ansible/playbook/roles/mysql/tasks/main.yml文件:

 制作/etc/ansible/playbook/roles/mysql/vars/main.yml文件:

 (6)启动安装分布式LNMP

 启动:

nginx启动成功

php启动成功:

mysql启动成功:

访问浏览器成功


三、问题

1.剧本启动php报错语法问题

(1)报错

 (2)原因分析

左端代码未对齐

(3)解决方法

修改前

修改后 

2.剧本启动mysql报错语法问题

 (1) 报错

 (2)原因分析

左端代码未对齐

(3)解决方法

修改前

修改后

3.剧本启动nginx开启失败

(1)报错

(2)原因分析

nginx端查询

default.conf.j2 配置错误 

未知的地址池

(3)解决方法

nginx端先移除多余配置文件

ansible端修改配置文件:

修改前:

修改后:

4.剧本安装php失败

(1) 报错

(2)原因分析

[弃用警告]:只在通过squash_actions使用循环时调用“yum”一次是不赞成的。而不是如果使用循环提供多个项目并指定' name: "{{ item }}" ',请使用' name: '{{ ... }}' '并删除循环。这个特性将在2.11版本中删除。弃用的警告可以通过在ansible.cfg中设置deprecation_warnings=False来禁用。
 

(3)解决方法

这里先暂不修改yml文件

修改php端网卡:

关闭防火墙和安全机制

如还是报错,修改/etc/ansible/playbook/roles/php/tasks/main.yml文件,安装方式不采用with_items方式,直接以command模块方式运行

修改前:

修改后:

成功

5.使用yum时报错

(1)报错

遇见failure: repodata/repomd.xml from base: [Errno 256]错误

(2)原因分析

yum源

(3)解决方法

更新依赖包,重新安装发现没用

yum clean all
yum install -y epel-release

更新ca-certficates包

yum clean all
yum --disablerepo=epel -y update  ca-certificates

将https转为http

cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak
sed -i 's#https://#http://#g' /etc/yum.repos.d/epel.repo

更改resolv.conf文件,然后重启network服务:service network restart

nameserver 8.8.8.8
search localdomain

以上步骤执行完成后如果仍然失败,继续执行以下步骤:

查看yum的依赖包

[root@localhost yum.repos.d]# rpm -qa|grep yum
PackageKit-yum-1.1.10-2.el7.centos.x86_64
yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch
yum-langpacks-0.4.2-7.el7.noarch
yum-metadata-parser-1.1.4-10.el7.x86_64
yum-utils-1.1.31-54.el7_8.noarch
yum-3.4.3-168.el7.centos.noarch

删除依赖包

[root@localhost yum.repos.d]#  rpm -e yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch --nodeps yum-metadata-parser-1.1.4-10.el7.x86_64 yum-3.4.3-168.el7.centos.noarch

将系统默认的yum功能删除

[root@localhost yum.repos.d]# rpm -aq|grep yum|xargs rpm -e --nodeps

查看本版和系统的位数

[root@localhost yum.repos.d]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

[root@localhost yum.repos.d]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped

下载yum包

# wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm
# wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
# wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm




注意:要注意版本
在http://mirrors.kernel.org/centos/ 或者 http://mirrors.163.com/centos/里下载
下载完成执行以下命令

# rpm -ivh  --nodeps yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm
# rpm -ivh  --nodeps yum-metadata-parser-1.1.4-10.el7.x86_64.rpm 
# rpm -ivh  --nodeps yum-3.4.3-132.el7.centos.0.1.noarch.rpm 




进入 /etc/yum.repos.d/目录中,在http://mirrors.163.com/.help/centos.html,在里面下载对应版本的repo文件,我下载了CentOS-Base.repo
对此文件进行备份,以防修改错误还有的用
修改$releasever为自己的版本号(我的为7)
保存退出

6.rpm -Uvh https://xxxx.rpm 提示连接失败问题

(1)报错

(2)原因分析

域名解析失败

(3)解决方法

查询IP地址

通过What Is My IP Address? Free IP Lookup查询对应url ip地址:

修改hosts 文件,追加一下内容

vim /etc/hosts

45.55.104.9(ip) webtatic.com(可自定义)

重新执行命令,访问对应地址成功

7.依赖检测失败

(1)报错

"警告:/var/tmp/rpm-tmp.cw1TWT: 头V4 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY\n\t软件包 epel-release-7-14.noarch 已经安装", "stderr_lines": ["警告:/var/tmp/rpm-tmp.cw1TWT: 头V4 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY"

(2)原因分析

未忽视依赖关系

(3)解决方法

在后面加上--force --nodeps就可以了,nodeps的意思是忽视依赖关系。

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm --force --nodeps  && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm --force --nodeps 
// 以上是我个人下载的erlang版本,要依据你们自己下载的版本改一下

修改前:

修改后:

成功

8.剧本修改php失败

(1)报错

www.conf文件不存在

(2)原因分析

缺失文件

(3)解决方法

新建目录并上传文件

成功

9.剧本启动php失败

(1)报错

ansible端

php端:

Failed to start php-fpm.service: Unit not found

(2)原因分析

系统中没有配置 php-fpm.service 文件

(3)解决方法

通过find / -name nginx.service 找到nginx.service 配置文件路径

[root@localhost php-fpm.d]# find /lib/systemd/system -name "php-fpm.service"
[root@localhost php-fpm.d]# find /etc/systemd/system -name "php-fpm.service"
/etc/systemd/system/php-fpm.service

创建软链接

[root@localhost php-fpm.d]# sudo ln -s /lib/systemd/system/php-fpm.service /etc/systemd/system/php-fpm.service

然后去到那个路径 新建一个php-fpm.service文件 保存下面这一段内容,php-fpm路径根据自己的实际情况修改

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm(你的php-fpm路径) --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf(你的php-fpm配置文件路径)
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

修改为:

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/run/php-fpm.pid
ExecStart=/etc/systemd/system  --nodaemonize --fpm-config /etc/php-fpm.d/www.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

10.剧本修改mysql脚本文件失败

(1)报错

(2)原因分析

缺少passwd.sh文件

(3)解决方法

新建文件

成功

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

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

相关文章

2023_Spark_实验一:Windows中基础环境安装

Ⅰ、WINDOWS中安装JDK1.8 一、下载安装包 链接&#xff1a;百度网盘 请输入提取码 所在文件夹&#xff1a;根目录或者大数据必备工具--》开发工具(前端后端)--》后端 下载文件名称&#xff1a;jdk-8u191-windows-x64.exe 二、安装JDK 1.现在转到下载的exe文件可用的文件夹&…

如何用Python爬虫持续监控商品价格

目录 持续监控商品价格步骤 1. 选择合适的爬虫库&#xff1a; 2. 选择目标网站&#xff1a; 3. 编写爬虫代码&#xff1a; 4. 设定监控频率&#xff1a; 5. 存储和展示数据&#xff1a; 6. 设置报警机制&#xff1a; 7. 异常处理和稳定性考虑&#xff1a; 可能会遇到的…

算法第一天——数组理论基础

数组 数组是存放连续内存空间上的相同类型数据的集合&#xff0c; 数组的下标都是从0开始&#xff0c; 数组内存空间的地址是连续的。 数组元素不能删除&#xff0c;只能修改。即数组数组一旦分配了内存空间就不能修改空间大小。 但是在java中&#xff0c;java的内存的空间地址…

说说Flink运行模式

分析&回答 1.开发者模式 在idea中运行Flink程序的方式就是开发模式。 2.local-cluster模式 Flink中的Local-cluster(本地集群)模式,单节点运行&#xff0c;主要用于测试, 学习。 3.Standalone模式 独立集群模式&#xff0c;由Flink自身提供计算资源。 4.Yarn模式 把Fl…

第2章 Linux多进程开发 2.19-2.23 与信号相关的函数

软件中断&#xff1a; 信号名称&#xff08;宏不会变&#xff09;&#xff0c;编号在不同的版本可能会变&#xff1a; core保存进程异常退出的信息&#xff1a; core.c: #include <stdio.h> #include <string.h>int main() {char * buf; // 指针 没有指…

【ACM出版】第四届人工智能与计算工程国际学术会议(ICAICE 2023)

ACM出版|第四届人工智能与计算工程国际学术会议 The 4th International Conference on Artificial Intelligence and Computer Engineering 为了在人工智能技术应用与计算工程领域进一步的探索&#xff0c;与国内外学界和业界相关人员交流新问题、新发现、新成果、新应用&…

各大時區問題

GMT和UTC代表的都是格林威治時間 當我們看到時間&#xff1a;2022-09-19T06:22:34.72Z 1.其中T代表的是日期和時間的分隔符&#xff0c;Z代表的是zero&#xff0c;零時區&#xff0c;也就是UTC時間 2.當我們看到&#xff1a;2022-09-19T06:22:3400:00 ,其中00:00代表的也是零時…

基于单片机教室人数实时检测系统

一、系统方案 主程序中main函数主要是引脚的初始化&#xff0c;给单片机引脚初始化&#xff0c;初始化LCD1602&#xff0c;初始化红外对管&#xff0c;通过对LCD1602赋值&#xff0c;采集进入教室的人数&#xff0c;显示在LCD1602上面进出人数我们采用按键的形式&#xff0c;检…

初始Redis之分布式

一.简单介绍: Redis是用来在内存中, 存储数据的, 他的初心是用来搞消息中间件(或者说消息队列 很熟悉了吧~~),但是呢用的不多,他现在主要是用来做 数据库,缓存 用来存储数据, 为什么不直接存储呢? Redis的优势就在于分布式系统 二.分布式系统 要说其分布式系统,简单想想都能…

el-select 使用

案例&#xff1a; /* * label : 界面上展示的是哪个字段,我这里需要展示名称 * value : 绑定的字段&#xff0c;一般是id */<el-selectv-model"Form.BillNumber"placeholder"请选择"change"changeValue($event)"><el-optionv-for"…

Android动态可编辑长度列表

概述 在界面实现一个列表&#xff0c;用户可以随意给列表新增或者删除项目&#xff0c;在开发中比较常用&#xff0c;但是真正做起来又有点花时间&#xff0c;今天花时间做一个&#xff0c;以便在以后的开发中用到。 详细 运行效果&#xff1a; 二、实现思路&#xff1a; 1…

leetcode316. 去除重复字母(单调栈 - java)

去除重复字母 题目描述单调栈代码演示进阶优化 上期经典 题目描述 难度 - 中等 leetcode316. 去除重复字母 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对…

TCP/UDP原理

文章目录 一、端口1. 端口的定义和作用2.服务端和客户端的区别3.常见的知名端口号有 二、TCP的原理1.TCP头部封装格式2.TCP可靠性机制三次握手确认机制四次挥手RST结束连接窗口机制 3.完整性校验4.TCP特征5.TCP的适用场景 三、UDP的原理1.UDP头部封装格式2.UDP特征3.UDP的适用场…

单元测试及其工具Junit

1.单元测试是什么 单元测试是开发者编写的一小段代码&#xff0c;用于检验被测代码的一个很小的、很明确的功能是否正确&#xff0c;通常而言&#xff0c;一个单元测试是用于判断某个特定条件&#xff08;或者场景&#xff09;下某个特定函数的行为。 单元测试是软件测试的一种…

MongoDB实验——MongoDB配置用户的访问控制

MongoDB 配置用户的访问控制 一、 实验原理 理解admin数据库&#xff1a;安装MongoDB时&#xff0c;会自动创建admin数据库&#xff0c;这是一个特殊数据库&#xff0c;提供了普通数据库没有的功能&#xff0c;例如&#xff0c;有些账户角色赋予用户操作多个数据库的权限&…

Elasticsearch:利用矢量搜索进行音乐信息检索

作者&#xff1a;Alex Salgado 欢迎来到音乐信息检索的未来&#xff0c;机器学习、矢量数据库和音频数据分析融合在一起&#xff0c;带来令人兴奋的新可能性&#xff01; 如果你对音乐数据分析领域感兴趣&#xff0c;或者只是热衷于技术如何彻底改变音乐行业&#xff0c;那么本…

spring多个aop切面之间的顺序

概述 业务中通常会定义多个注解来进行切面&#xff0c;那么当一个方法有多个注解的时候&#xff0c;此时这些切面是以什么顺序来执行的呢。 spring的aop切面有点像鸡蛋的层次 最外面的切面包裹着里面的切面 捞个网图 排序实现 既然是属于spring的&#xff0c;那用的肯定是…

pear admin 切换mysql梳理

pear admin 切换mysql&梳理 一、切换mysql操作步骤详解1.1 config.py内容修改1.2 注意事项 二、二开梳理2.1 需求2.2 用户管理部分梳理 一、切换mysql操作步骤详解 1.1 config.py内容修改 import logging import os# 主题面板的链接列表配置 SYSTEM_NAME "Pear Adm…

Web后端开发(请求响应)上

请求响应的概述 浏览器&#xff08;请求&#xff09;<--------------------------(HTTP协议)---------------------->&#xff08;响应&#xff09;Web服务器 请求&#xff1a;获取请求数据 响应&#xff1a;设置响应数据 BS架构&#xff1a;浏览器/服务器架构模式。…

IDEA配置MAVEN本地仓库

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…