自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

目录

一、inventory 主机清单

1.1inventory 中的变量

1.1.1主机变量

1.1.2组变量

1.1.3组嵌套

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

2.2playbook格式

2.3playbooks 的组成

2.4playbook编写

2.5运行playbook

2.5.1ansible-playbook命令使用

​2.6playbook定义、引用变量

2.7指定远程主机sudo切换用户

2.8when条件判断

2.8.1调用command模块shutdown服务

2.8.2调用service模块关闭httpd服务

2.9迭代

2.9.1批量创建目录

2.9.2批量创建文件

2.9.3批量创建目录、批量创建多个用户,并加入指定的组


一、inventory 主机清单

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内

如果是名称类似的主机,可以使用列表的方式表示各个主机
vim /etc/ansible/hosts
[webservers]
192.168.246.8:2222			#冒号后定义远程连接端口,默认是ssh的22端口
192.168.246.1[1:5]			#范围是:192.168.246.11到192.168.246.15[dbservers]
db-[a:f].example.org		#支持匹配 a~f

1.1inventory 中的变量

Inventory变量名含义
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user

连接对方主机时使用的主机名。

不指定时,将使用执行ansible或ansible-playbook命令的用户

ansible_passwd连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、 scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password提升为指定用户权限时的密码

1.1.1主机变量

写法1:
[webservers]
192.168.246.8 ansible_port=22 ansible_user=root ansible_password=abc123
192.168.246.10 ansible_port=22 ansible_user=root ansible_password=abc123
#webservers组中被控制端192.168.246.8的端口号为22登录时用户是root密码为abc123写法2:
[webservers]
192.168.30.1[1:2] ansible_port=22 ansible_user=root ansible_password=abc123
#如果是名称类似的主机,可以使用列表的方式标识各个主机#不建立将密码直接写入配置,不安全写法3:
[webservers]
192.168.30.11:22
192.168.30.12:22
#默认ssh管理时的端口为22,若不是22则直接在被管理ip后加冒号和对应端口号

写法一:修改端口

写法二:

1.1.2组变量

[webservers:vars]     
ansible_user=root
ansible_password=abc123
#表示webservers 组内所有主机定义变量控制时使用root账户密码为abc123[all:vars]       
ansible_port=22
#表示为所有组的所有主机定义变量使用ssh远程管理时都是22端口

修改被控制端口为1212

再去ansible主机检测

1.1.3组嵌套

[nginx]   #nginx组
192.168.246.8
192.168.246.9[httpd]   #httpd组
192.168.246.11
192.168.246.12
#组内嵌为web[web:children]
nginx
httpd
#表示web组的成员即children的直译‘孩子’包括nginx和httpd组

进行检测

二、Ansible 的脚本 ------ playbook(剧本)

2.1 playbook介绍

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。

playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

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

Ansible Playbook(剧本)是Ansible 的核心组件之一,是一种以 YAML 格式编写的自动化任务描述文件。

  • 每个 Playbook 由一个或多个 Play 组成。
  • 在每个 Play 下面,通过 tasks 关键字来定义一组任务。
  • 每个任务由一个或多个模块组成,用于在远程主机上实现自动化部署、配置和管理等操作

2.2playbook格式

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

一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name。

注意事项:

①大小写明个

②通过缩进表示层级关系

③不支持制表符tab键缩进,只能使用空格缩进

④缩进的空格数目不重要,只要相同层级左右对齐,通常开头缩进2个空格

⑤#号注释

⑥符号字符后缩进1个空格,如冒号:逗号,横杠-后面空一个格

⑦如果包含特殊字符用单引号和双引号引起来会作为字符串处理,单引号不识别变量,双引号识别变量。

2.3playbooks 的组成

  • Tasks:任务,即通过 task 调用 ansible 的模块将多个操作组织在一个playbook 中运行
  • Variables:变量
  • Templates:模板
  • Handlers:处理器,当 changed 状态条件满足时,(notify)触发执行的操作。
  • Roles:角色

2.4playbook编写

注意修改sshd的端口

vim test1.yaml
---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play     #定义一个play的名称,可省略gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔remote_user: root    #指定被管理主机上执行任务的用户tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行- name: test connection    #自定义任务名称ping:     #使用 module: [options] 格式来定义一个任务- name: disable selinuxcommand: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务- name: disable firewalldservice: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块- name: restart httpd    #notify和handlers中任务的名称必须一致service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

---
- name: install httpdgather_facts: falsehosts: web-z1remote_user: roottasks:- name: test pingping:- name: disable firewalldservice: name=firewalld state=stopped- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.confnotify: "restart httpd"- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted

解释:

---
#ymal文件开头,可不写
- name: test
#定义play名称,可不写gather_facts: false
#设置不进行facts信息收集,这可以加快执行速度,可省略默认开启hosts: webservers
#要执行的组或者主机,webservers为组名需要在/etc/ansible/hosts中配置remote_user: root
#执行时所使用的用户tasks:
#定义任务列表,列表中任务按顺序执行- name: test ping
#自定义name的任务名称ping:
#第一个任务执行内容为使用ping模块ping,webservers组的主机- name: test selinuxcommand: /sbin/setenforce 0
#第二个任务执行内容为使用command模块关闭selinuxignore_errors: false
#若出现错误,忽略继续运行下面的任务,默认为true出错立即停止playbooks- name: test stop firewalldservice: name=firewalld state=stopped
#第三个任务执行内容为使用service模块关闭firewalld防火墙- name: test yumyum: name=httpd state=latest
#第四个任务执行内容为使用yum模块安装httpd服务状态为latest- name: test copycopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#第五个任务为使用copy模块将ansible上的/etc/httpd.conf文件拷贝到指定组的主配置文件下替换,注意此处需要在ansible的/opt目录上有一个httpd.conf的模版否则会报错notify: "restart httpd"
#如果上面的copy任务成功,则调用handlers模块的restart httpd,注意要与下面handlers的name名称相同- name: test start httpdservice: enabled=yes name=httpd state=started
#第六个任务执行内容为使用service模块启动httpd服务并设置开机自启handlers:- name: restart httpdservice: name=httpd state=restarted
#handlers模块,若notify成立则执行此模块内容调用service模块重启httpd服务。注意使用name名称调用

验证httpd服务是否开启

2.5运行playbook

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

2.5.1ansible-playbook命令使用

ansible-playbook test.yaml --syntax-check

ansible-playbook test.yaml --list-task

ansible-playbook test.yaml --list-hosts

ansible-playbook test.yaml --start-at-task='install httpd'


2.6playbook定义、引用变量

---
- name: second playhosts: dbserversremote_user: rootvars:                 #定义变量- groupname: mysql   #格式为 key: value- username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=306    #使用 {{key}} 引用变量的值- name: create useruser: name={{username}} uid=306 group={{groupname}} - name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息ansible-playbook test1.yaml -e "username=nginx"     #在命令行里定义变量

---
- name: second playhosts: web-z1remote_user: rootvars:
#使用变量模块- groupname: testgroup
#定义变量groupname的值为testgroup- username: testuser
#定义变量username的值为testusertasks:- name: create groupgroup: name={{groupname}} gid=111
#第一个任务使用group模块调用定义的groupname变量创建组- name: create useruser: name={{username}} uid=10086 group={{groupname}}
#第二个任务使用user模块调用定义的username变量创建用户指定uid和组

ansible-playbook  一种定义的任务方式,在编写 playbook 时可以使用变量来传数据
playbook引用变量指的是在playbook中使用变量代理静态常量值,来实现动态的配置过程 ,通过引用变量 ,可以使playbook更具有灵活性和可重复性
{{name}}来引用变量

2.7指定远程主机sudo切换用户

远端主机查看用户

ansible管理端主机操作

---
- hosts: 192.168.246.8remote_user: ky66    #2.6版本以后的参数,之前是sudo,意思为切换用户运行become: yes          #指定sudo用户为rootbecome_user: root

执行playbook时:ansible-playbook test04.yml -K <密码>

[root@localhost ~]#vim /etc/sudoers
不仅在playbook文件中设置sudo提权  还需要在对应的主机上实现sudo提权
[root@localhost playbook]#ansible-playbook test04.yaml -k -K
-k 指定ssh的登录密码
-K 大写需要输入用户的登录密码

这个也要提权,不然就会报错哦

echo "ky66 ALL=(ALL) ALL" >> /etc/sudoers

2.8when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

2.8.1调用command模块shutdown服务

---
- hosts: web-z1remote_user: roottasks:- name: shutdown hostcommand: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address == "192.168.246.8"#when指令中的变量名不需要手动加上 {{}} 或者用它when: inventory_hostname == "<主机名>"

when用来进行条件判断的关键字 ,其作用只在你指定条件下会执行下面的任务,当条件为真时,任务就会被执行,否则任务将被跳过

2.8.2调用service模块关闭httpd服务

---
- hosts: web-z1remote_user: roottasks:- name: test whenservice: name=httpd state=stoppedwhen: ansible_default_ipv4.address == "192.168.246.8"#当内置的变量ipv4.address等于192.168.246.8时调用service模块关闭httpd服务


2.9迭代

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环

2.9.1批量创建目录

---
- name: play1hosts: web-z1gather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:- /mnt/nangjing- /mnt/hefei

2.9.2批量创建文件

---
- name: play1hosts: web-z1gather_facts: falsetasks:- name: create filefile:path: "{{item}}"state: touchwith_items:- /mnt/a.txt- /mnt/b.txt

远程主机查看

2.9.3批量创建目录、批量创建多个用户,并加入指定的组

---
- name: play1hosts: web-z1gather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:          #等同于 loop:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root

远端主机查看

总结:

inventory主机清单管理
主机清单配置文件   /etc/ansible/hosts格式:
[组名]
主机IP[:ssh端口]     #默认是 22 端口
主机名[:ssh端口]
主机IP[0:255]        #设置连续的主机列表范围
主机名[a:z]    ansible_port=     ansible_user=    ansible_password=           #设置主机变量[组名:vars]             #设置组变量
ansible_port=
ansible_user=
ansible_password=[大组名:children]       #设置嵌套组
组名1
组名2
组名3playbook剧本
vim XXX.yaml  XXX.yml
---
- name:                 #设置play的名称hosts:                #指定执行此play的远程主机组remote_user:          #指定执行此play的用户#become:              #设置是否sudo切换#become_user:         #指定sudo切换的用户gather_facts:         #设置是否收集facts信息 yes|no|true|falsevars:                 #设置自定义变量tasks:                #指定此play的任务列表- name:                  #定义任务的名称模块名: 模块参数       #定义任务要使用的模块和参数(键值对格式)- name:  模块名: 模块参数ignore_errors: true    #忽略此任务的失败- name:  模块名: 模块参数notify: '任务名'       #定义此任务执行结果为changed状态时要触发的handlers任务- name:  模块名: 模块参数when:                  #定义条件表达式(== != > >= < <=),条件成立时执行此task任务,否则不执行此任务- name:  模块名: 模块参数={{item}}with_items:            #定义循环列表- name:  模块名: 模块参数tags:                  #定义任务的标签,ansible-playbook --tags="标签" 可实现仅执行拥有指定标签的任务(拥有always标签的任务总是执行)- 标签1- 标签2....handlers:- name: 任务名模块名: 模块参数ansible-playbook XXX.yaml -u -k -K  --syntax-check--list-task--list-hosts--start-at-task="任务名称"--tags="标签"tasks任务的模块语法格式:
纵向格式:模块名:参数1: 值参数2: "{{变量名}}"....
横向格式:模块名: 参数1=值  参数2={{变量名}} ....with_items 和 vars 的语法格式
纵向格式:- name:with_items:- 值1- 值2....模块名: 参数={{item}}vars:变量名:- 值1- 值2....tasks:- name:模块名: 参数={{item}}with_items: "{{变量名}}"#值为对象类型(键值对字段)时:with_items:- key1: 值1key2: 值2- key1: 值3key2: 值4....vars:变量名:- key1: 值1key2: 值2- key1: 值3key2: 值4....横向格式:#值为纯量类型时:with_items: [值1, 值2, ....]vars:变量名: [值1, 值2, ....]#值为对象类型(键值对字段)时:with_items:- {key1: 值1, key2: 值2}- {key1: 值3, key2: 值4}....template配置模板模块
1)先准备一个 XXX.j2 配置模板文件,在模板文件中使用 {{变量名}} 格式引用主机变量、组变量、facts信息字段变量或vars字段自定义的变量的值
2)编辑 playbook 文件,在文件中的 tasks 任务中定义 template 模块配置(template: src=XXX.j2文件路径 dest=远程主机文件路径)roles角色的作用?
可以把playbook剧本里的各个play看作为一个角色,将各个角色的tasks任务、vars变量、template模板和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理,在需要的时候可在playbook中使用roles角色直接调用即可。也就是说roles角色可以在playbook中实现代码的复用。roles/                         #角色总目录,其每个子目录就是一个角色目录nginx/                         #相当于playbook中的每一个play主题,目录名就是角色名files/                         #存放copy、script模块调用的文件templates/                     #存放template模块调用的 XXX.j2 模板文件tasks/main.yml                 #定义此角色的tasks普通任务列表handlers/main.yml              #定义此角色通过notify触发时执行的handlers处理器任务列表vars/main.yml                  #定义此角色用的自定义变量defaults/main.yml              #定义此角色用的默认变量(一般不用)meta/main.yml                  #定义此角色的元数据信息和依赖关系mysql/.... php/....vim XXX.yaml
- name:hosts:remote_user:roles:- nginx- mysql- phpansible-playbook XXX.yaml

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

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

相关文章

JavaScript中的扩展操作符作用是什么,有什么含义?

在 JavaScript 中&#xff0c;扩展操作符允许一个表达式在某些地方展开成多个元素。这个特性在 ES2015 (也叫做 ES6) 中被引入到 JavaScript 语言中&#xff0c;并广泛用于数组和对象。在您的代码示例中&#xff0c;它被用于对象。 对象中的扩展操作符 在对象字面量中使用扩展…

SolidWorks进行热力学有限元分析二、模型装配

1.先打开软件&#xff0c;新建装配体 2.选中你要装配的零件&#xff0c;直接导入就行 3.鼠标点击左键直接先放进去 4.开始装配&#xff0c;点配合 5.选择你要接触的两个面&#xff0c;鼠标右键确定&#xff0c;然后把剩下的面对齐一下就行了 6.搞定

Day1| Java基础 | 1 面向对象特性

Day1 | Java基础 | 1 面向对象特性 基础补充版Java中的开闭原则面向对象继承实现继承this和super关键字修饰符Object类和转型子父类初始化顺序 多态一个简单应用在构造方法中调用多态方法多态与向下转型 问题回答版面向对象面向对象的三大特性是什么&#xff1f;多态特性你是怎…

嵌入式学习

笔记 作业 将一张bmp图片修改成德国国旗。 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #in…

基于vue.js+thymeleaf模板引擎+ajax的注册登陆简洁模板(含从零到一详细介绍)

文章目录 前言1、数据库准备2、工具类与相关基类使用2.1、工具类2.2、相关基类 3、web包目录说明4、注册功能设计&#xff08;本文核心部分&#xff09;4.1、注册页面设计4.2、注册逻辑设计 5、登陆功能设计5.1、登陆页面设计5.2、登陆逻辑设计 6、运行效果图 前言 大多数的网…

【初阶数据结构】单链表之环形链表

目录标题 前言环形链表的约瑟夫问题环形链表环形链表|| 前言 前面我们已经学习了关于单链表的一些基本东西&#xff0c;今天我们来学习单链表的一个拓展——环形链表&#xff0c;我们将用力扣和牛客网上的三道题目来分析讲解环形链表问题。 环形链表的约瑟夫问题 我们首先来看…

Transformer详解:从放弃到入门(三)

上篇文章中我们了解了多头注意力和位置编码&#xff0c;本文我们继续了解Transformer中剩下的其他组件。 层归一化 层归一化想要解决一个问题&#xff0c;这个问题在Batch Normalization的论文中有详细的描述&#xff0c;即深层网络中内部结点在训练过程中分布的变化问题。  …

高效工作之:开源工具kettle实战

在运营商数据处理领域&#xff0c;Oracle存储过程一直是数据处理的核心工具&#xff0c;但随着技术的发展&#xff0c;寻找替代方案变得迫切。Kettle&#xff0c;作为Oracle存储过程的替代品&#xff0c;以其强大的功能和易用性&#xff0c;正逐渐受到运营商的青睐。本文将介绍…

短视频矩阵系统ai剪辑 矩阵 文案 无人直播四合一功能核心独家源头saas开发

抖去推矩阵AI小程序是一款针对短视频平台的智能创作和运营工具&#xff0c;它具有以下功能特点&#xff1a; 1.批量视频生成&#xff1a;抖去推可以在短时间内生成大量视频&#xff0c;帮助商家快速制作出适合在短视频平台上推广的内容 2.全行业覆盖&#xff1a;适用于多个行业…

品深茶的抗癌功能是否涉及虚假宣传?

品深茶说到底&#xff0c;本质还是中国传统茶叶&#xff0c;茶叶本就是一种含有多种成分的饮品&#xff0c;包括茶多酚、生物碱、氨基酸、有机酸等。这些成分对人体有一定的益处&#xff0c;如抗氧化、抗炎、抗菌等作用。 一些研究表明&#xff0c;茶叶中的某些成分如茶多酚、…

Map集合的实现类~TreeMap

重复依据&#xff1a;通过对键进行排序 先创建Student类&#xff0c;并在主函数new对象&#xff0c;然后创建TreeMap&#xff1a; 建立红黑树&#xff0c;需要在Student类后面实现类的接口&#xff1a; 重写其中的compareTo方法&#xff1a; 或者可以自定义比较器&#xff1a; …

自动语音识别

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

每天五分钟计算机视觉:通过交并比判断对象检测算法的性能

本文重点 在对象检测领域,交并比(Intersection over Union,简称IoU)是衡量算法性能的重要指标之一。它不仅直观地反映了预测框与真实框之间的重叠程度,还是判断算法是否“运行良好”的关键依据。 那个定位是好的? 对象检测任务中,我们希望不仅检测到对象,同时我们还希…

最新版Ceph( Reef版本)块存储简单对接k8s

当前ceph 你的ceph集群上执行 1.创建名为k8s-rbd 的存储池 ceph osd pool create k8s-rbd 64 642.初始化 rbd pool init k8s-rbd3 创建k8s访问块设备的认证用户 ceph auth get-or-create client.kubernetes mon profile rbd osd profile rbd pool=k8s-rbd部署 ceph-rbd-csi …

vue2人力资源项目5组织架构的增删改查

编辑表单回显 父组件&#xff1a;这里用到了父亲调子组件的方法和同步异步先后方法的处理 //methods里else if (type edit) {this.showDialog true// 显示弹层this.currentNodeId id// 记录id&#xff0c;要用它获取数据// 在子组件中获取数据// 父组件调用子组件的方法来获…

零基础代码随想录【Day27】|| 39. 组合总和,40.组合总和II, 131.分割回文串

目录 DAY27 39. 组合总和 解题思路&代码 40.组合总和II 解题思路&代码 131.分割回文串 解题思路&代码 DAY27 39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有…

MySQL日志机制【undo log、redo log、binlog 】

前言 SQL执行流程图文分析&#xff1a;从连接到执行的全貌_一条 sql 执行的全流程?-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞20次&#xff0c;收藏12次。本文探讨 MySQL 执行一条 SQL 查询语句的详细流程&#xff0c;从连接器开始&#xff0c;逐步介绍了查询缓存、解析 S…

Prompt提示词教程 | 提示工程指南 | 提示词示例 入门篇

在上一节中&#xff0c;我们介绍并给出了如何赋能大语言模型的基本示例。如果还没看而且是刚入门的同学建议看下&#xff0c;有个基本概念。 Prompt提示词教程 | 提示工程指南 | 提示工程简介https://blog.csdn.net/HRG520JN/article/details/138523705在本节中&#xff0c;我…

基于springboot+vue+Mysql的教师人事档案管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

力扣刷题--数组--第二天

今天仍然做二分查找相关的题目。先来回顾一下二分查找的方法和使用的条件。二分查找是在数组中查找目标值的一种方法&#xff0c;通过边界索引确定中间索引&#xff0c;判断中间索引处的元素值和目标值的大小&#xff0c;来不断缩小查找区间。使用二分查找有如下一些限制&#…