⾃动化运维利器Ansible-基础

Ansible基础

  • 一、工作原理
  • 二、快速入门
    • 2.1 测试所有资产的网络连通性
    • 2.2 发布文件到被管理节点(资产)
  • 三、资产(被管理节点)
    • 3.1 静态资产
      • 3.1.1 自定义资产
      • 3.1.2 自定义资产的使用
      • 3.1.3 资产选择器
  • 四、Ansible Ad-Hoc 命令
    • 4.1 模块类型
      • 4.1.1 command & shell 模块
      • 4.1.2 copy模块
      • 4.1.3 yum_repsitory模块
      • 4.1.4 yum 模块
      • 4.1.5 user模块

按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战

一、工作原理

Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。

Ansible ⽤ Python 编写,尽管市⾯上已经有很多可供选择的配置管理解决⽅案(例如 Salt、Puppet、Chef等),但它们各有优劣,⽽Ansible的特点在于它的简洁。

让 Ansible 在主流的配置管理系统中与众不同的⼀点便是,它并不需要你在想要配置的每个节点上安装⾃⼰的组件。同时提供的另⼀个优点,如果需要的话,你可以在不⽌⼀个地⽅控制你的整个基础架构
在这里插入图片描述

  • 在ANSIBLE 管理体系中,存在"管理节点" 和 “被管理节点” 两种⻆⾊。
  • 被管理节点通常被称为"资产"
  • 在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。并通过SSH将这些Python 脚本传递到被管理服务器上。在被管理服务器上依次执⾏,并实时的将结果返回给管理节点

二、快速入门

Ansible的安装非常简单,此处不再做说明了


管理节点:

  • 172.18.0.2

被管理节点(资产):

  • 172.18.0.3
  • 172.17.0.4

管理节点 和 被管理节点之间的节点已经打通 SSH 信任关系。

2.1 测试所有资产的网络连通性

ansible all -i 172.18.0.3,172.18.0.4 -m ping172.18.0.4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python":
"/usr/bin/python"},"changed": false,"ping": "pong"
}
172.18.0.3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python":
"/usr/bin/python"},"changed": false,"ping": "pong"
}

注意 -i 参数后⾯接的是⼀个列表(List)。因此当为⼀个被管理节点时,我们后⾯⼀定要加⼀个英⽂逗号(,),告知是List

2.2 发布文件到被管理节点(资产)

touch /tmp/a.conf
ansible all -i 172.18.0.3,172.18.0.4 -m copy -a
"src=/tmp/a.conf dest=/tmp/a.conf"

src(source) 源地址,dest(destination)目标地址


参数解释:

  • all 在 ansible 中称为资产选择器。就是匹配资产(-i 参数指定的清单) 中的⼀部分。

    此处的all -i 172.18.0.3,172.18.0.4 指的是匹配-i 参数指定的清单(172.18.0.3,172.18.0.4)的所有资产。

  • -i 指定Ansible 的资产,也就是被管理服务器。
  • -m 指定要运⾏的模块,例如上述的 ping 模块和 copy 模块。

    模块为ansible提供的,也可以是社区开源的模块。

  • -a 指定模块的参数,模块 ping 没有指定参数, 模块 copy指定了 src 和 dest 参数。

三、资产(被管理节点)

在实际场景中,ansible要管理的服务器往往要多得多。依然使用 -i 参数后⾯⼀个个追加IP显然不合乎常理。

Ansible的资产,主要分为静态资产和动态资产,此处先介绍静态资产。

3.1 静态资产

在 Ansible 中,静态资产(static assets)指的是那些在运行时不会发生变化的资源或配置文件。这些资产通常是预先定义好的,并且在整个 Ansible 运行过程中保持不变。

静态资产本身是⼀个文本文件,⼀个格式类似INI的文件,默认情况下,Ansible的资产⽂件位于 /ect/ansible/hosts,安装方式不同可能没有该文件,手动创建即可。

静态资产可以包括但不限于以下几类:

库存文件(Inventory Files):库存文件定义了目标主机及其分组信息。这些文件是静态的,除非手动修改,否则在 Ansible 运行过程中不会发生变化。

INI格式:
[webservers]
web1.example.com
web2.example.comyaml格式:
all:children:webservers:hosts:web1.example.com:web2.example.com:

变量文件(Variable Files):变量文件包含可以在 playbook 中使用的变量定义。这些文件通常也是静态的,除非手动修改。

app_name: myapp
app_port: 8080

模板文件(Template Files):模板文件用于生成配置文件或其他文本文件。这些模板文件通常是静态的,但在运行时会被 Ansible 渲染成最终的配置文件。(后边介绍)

角色(Roles):角色是一组相关的任务、文件、模板和变量的集合。角色文件夹中的内容通常是静态的,除非手动修改。
Playbook 文件:Playbook 文件定义了一组任务,这些任务将在目标主机上执行。Playbook 文件通常是静态的,除非手动修改。

3.1.1 自定义资产

上述提到的INI格式文件静态资产可以进行自定义,下⾯给出⼀个⾃定义的静态资产实例,然后再具体解释其含义。

cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
aimyon36.com
ztmy.com
aimyon[05:09].com    //aimyon05.com ....aimyon09.com[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5[dbdb_servers]
192.168.2.2
192.168.2.3
192.168.1.5[alldb_servers]
[alldb_servers:children]
dbdb_servers
web_servers
  • Ansible 的资产⽂件中,可以以IP地址的形式或者主机名(如果使用主机名须配置hosts的映射)的形式存在。
  • Ansible 的资产若连续,可以使⽤[stat:end] 的形式去表达。
  • 可以将服务器按照业务场景定义成组,⽐如dbdb_servers 和web_servers
  • 组和组之间可以存在继承关系,⽐如dbdb_servers 和web_servers 同时继承 alldb_servers 组

3.1.2 自定义资产的使用

ansible all -i inventory.ini ... 
  • -i 参数用来指定资产。
  • 通过 -i 参数指定⾃定义资产的位置即可(可以是全路径,也可以是相对路径)。

列举出所有资产

ansible all -i inventory.ini --list-hostshosts (29):1.1.1.12.2.2.23.3.3.1...略...

列举出选定资产

ansible web_servers -i inventory.ini --listhostshosts (3):192.168.2.2192.168.2.3192.168.1.5

-i 是指定要进行匹配的资产
web_servers 是匹配指定的资产中属于web_servers这个组的资产

3.1.3 资产选择器

有时操作者希望只对资产中的⼀部分服务器进⾏操作,而不是资产中所有服务器。此时可以使⽤ Ansible 的PATTERN资产选择器。

基本语法格式

  • ansible PATTERN -i inventory -m module -a argument

选择⼀台或者多台服务器

ansible 1.1.1.1 -i inventory.ini --list-hostshosts (1):1.1.1.1ansible aimyon36.com -i inventory.ini --listhostshosts (1):aimyon36.comansible 1.1.1.1,2.2.2.2 -i inventory.ini --listhostshosts (2):1.1.1.12.2.2.2

选择⼀组服务器

ansible web_servers -i inventory.ini --list-hostshosts (3):192.168.1.2192.168.1.3192.168.1.5

使用*匹配

ansible 3.3.3.1* -i inventory.ini --list-hostshosts (7):3.3.3.133.3.3.103.3.3.113.3.3.123.3.3.143.3.3.153.3.3.1

使⽤逻辑匹配

ansible 'web_servers:db_servers' -i inventory.ini --list-hosts //web_servers 和 dbdb_servers 的并集hosts (5):192.168.1.2192.168.1.3192.168.1.5192.168.2.2192.168.2.3ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts //web_servers 和 dbdb_servers 的交集hosts (1):192.168.1.5ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts //在 web_servers 中,但是不在 db_servers 中hosts (2):192.168.1.2192.168.1.3

四、Ansible Ad-Hoc 命令

Ansible Ad-Hoc其实是⼀个概念性的名字,是相对于写Ansible playbook 来说的.类似于在命令⾏敲⼊shell命令和 写shell scripts两者之间的关系。可以⽤于执⾏⼀些临时命令。

如果希望敲⼊⼀些命令去比较快的完成⼀些事情,⽽不需要将这些执⾏的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

Ansible提供两种⽅式去完成任务,⼀是 ad-hoc(临时) 命令,⼀是写Ansible playbook(剧本)。前者可以解决⼀些简单的任务, 后者解决较复杂的任务,⽐如做配置管理或部署。

命令格式

  • ansible pattern [-i inventory] -m module -a argument
  • pattern 资产选择器
  • -i 指定资产清单⽂件的位置
  • -m 指定本次Ansible ad-hoc 要执⾏的模块。可以类别成SHELL 中的命令。
  • -a 模块的参数. 可以类⽐成SHELL 中的命令参数

快速入门部分介绍的就是ad-hoc命令,快速入门部分已经介绍了通过ansible筛选出指定的资产进行相应操作,但在实际操作上,我们希望使用到文件传输,修改,服务安装等操作。因此需要引入模块进行操作。

4.1 模块类型

Ansible 模块分三种类型: 核⼼模块(core module)、附加模块(extra module)及用户⾃定义模块(consume module)。

核⼼模块是由Ansible 的官⽅团队提供的。附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。
当核⼼模块和附加模块都⽆法满⾜你的需求时,⽤户可以⾃定义模块。
默认情况下,在安装Ansible 的时候, 核⼼模块和附加模块都已经安装而⽆需⽤户干预。

Ansible 的核⼼模块和附加模块,数量有3000+ 。这样庞⼤的模块数量,对于任何⼀个接触Ansible 的⼈都不可能将其完全记住、掌握使⽤。 因此能够顺利使⽤Ansible 的帮助⽂档,对我们来说是很有必要的。Ansible 的帮助⽂档,由它本身提供的命令ansible-doc 实现。

常用帮助命令

列举出所有的核⼼模块和附加模块

  • ansible-doc -l

查询某个模块的使⽤⽅法

  • ansible-doc modulename

查询某个模块的使⽤⽅法,⽐较简洁的信息

  • ansible-doc -s modulename

4.1.1 command & shell 模块

command & shell 两个模块都是在远程服务器上去执⾏命令。command模块是ad-hoc的默认模块,在执⾏ad-hoc时,若不指定模块的名字则默认使⽤此模块。

ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
helloansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello

shell 模块可以执⾏SHELL 的内置命令和 特性(⽐如管道符)。
command 模块⽆法执⾏SHELL 的内置命令和特性。

4.1.2 copy模块

copy 模块的主要⽤于管理节点和被管理节点之间的⽂件拷⻉。

常用参数

  • src 指定拷⻉⽂件的源地址
  • dest 指定拷⻉⽂件的⽬标地址
  • backup 拷⻉⽂件前,若原⽬标⽂件发⽣了变化,则对⽬标⽂件进行备份
  • woner 指定新拷⻉⽂件的所有者
  • group 指定新拷⻉⽂件的所有组
  • mode 指定新拷⻉⽂件的权限

copy 管理节点上的 nginx.repo 到被管理节点上

 ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo

copy 前, 在被管理节点上对原⽂件进⾏备份

ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"

copy ⽂件的同时对⽂件进⾏⽤户及⽤户组设置

ansible all -i hosts -m copy -a "src=./nginx.repodest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"

copy ⽂件的同时对⽂件进⾏权限设置

ansible all -i hosts -m copy -a "src=./nginx.repo
dest=/etc/yum.repos.d/nginx.repo mode=0755"

4.1.3 yum_repsitory模块

主要用于向被管理节点添加yum仓库源。

常⽤参数

  • name 仓库名称,就是仓库⽂件中第⼀⾏的中括号中名称,必须的参数。
  • description 仓库描述信息,添加时必须的参数
  • baseurl yum存储库 “repodata” ⽬录所在⽬录的URL,添加时必须的参数。它也可以是多个URL的列表。
  • file 仓库⽂件保存到被管理节点的⽂件名,不包含 .repo。默认是 name 的值。
  • state preset 确认添加仓库⽂件, absent 确认删除仓库⽂件。
  • gpgcheck 是否检查 GPG yes|no, 没有默认值,使⽤/etc/yum.conf 中的配置。

添加 epel 源

 ansible dbservers -i hosts -m
yum_repository -a "name=epel
baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/' 
description='EPEL YUM repo'"
172.18.0.3 | CHANGED => {"ansible_facts": {"discovered_interpreter_python":
"/usr/bin/python"},"changed": true,"repo": "epel","state": "present"}

删除epel源

ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
172.18.0.3 | CHANGED => {"ansible_facts": {"discovered_interpreter_python":
"/usr/bin/python"},"changed": true,"repo": "epel","state": "absent"
}

4.1.4 yum 模块

等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进⾏管理。

常用参数

  • name 要安装的软件包名, 多个软件包以英⽂逗号(,) 隔开
  • state 对当前指定的软件安装、移除操作(present installed latest absent removed)
    • present 确认已经安装,但不升级
    • installed 确认已经安装
    • latest 确保安装,且升级为最新
    • absent 和 removed 确认已移除

安装⼀个软件包

ansible webservers -i hosts -m yum -a
"name=nginx state=present"ansible webservers -i hosts -m yum -a
"name=nginx state=latest"ansible webservers -i hosts -m yum -a
"name=nginx state=installed"

安装⼀个软件包组

ansible webservers -i hosts -m yum -a
"name='@Development tools' state=present"

4.1.5 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 设置为 yes 将会为⽤户⽣成密钥,这不会覆盖原来的密钥
  • ssh_key_type 指定⽤户的密钥类型, 默认 rsa, 具体的类型取决于被管理节点
  • state 删除或添加⽤户, present 为添加,absent 为删除;默认值 present
  • remove 当与 state=absent ⼀起使⽤,删除⼀个⽤户及关联的⽬录,⽐如家⽬录,邮箱⽬录。可选的值为: yes/no

创建⽤户并设置密码

pass=$(echo "123456" | openssl passwd -1 -stdin)
ansible all -i hosts -m user -a "name=foo password=${pass}"

创建⽤户 yangge, 并且为其创建密钥对,并且密钥类型为:ecdsa

ansible all -i hosts -m user -a "name=yangge
generate_ssh_key=yes ssh_key_type=ecdsa"

创建⽤ tom, 并且设置其有效期到 2020年4⽉15⽇, 加⼊到组db_admin 中, 不改变⽤户原有假如的组。

 ansible dbservers -i hosts -m user -a
"name=tom expires=$(date +%s -d 20200415)
gorups=db_admin append=yes"

本章节Ansible-基础就介绍到这,相信看到这已经能够用ansible在资产服务器上执行一些简单的命令了,关于ansible的模块,可以自行查看文档了解,此处不再介绍了,说再多用不到也白扯 - - #

按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战

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

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

相关文章

一文了解Android中的AudioFlinger

AudioFlinger 是 Android 音频框架中的一个核心组件,负责管理音频流的混合和输出。它是 Android 音频系统服务的一部分,作为音频框架和硬件之间的桥梁,接收应用程序的音频请求、进行混音处理,并最终通过音频硬件输出声音。 下面我…

基于YOLOv8深度学习的智慧交通事故评级检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOv8深度学习模型的智慧交通事故评级检测系统,旨在解决传统交通事故检测过程中效率低、误报率高等问题。该系统通过深度学习技术的应用,结合交通事故图像的分析,能够实现对事故的精准识别和评级,进而为…

以Java为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。

江河湖海中的代码之旅:打造你的命令行图书管理系统 一、系统简介 1. Java简介 Java,这个编程语言界的“瑞士军刀”,自1995年诞生以来就以其跨平台的特性和强大的生态系统征服了无数开发者的心。想象一下,Java就像是一条蜿蜒曲折…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址(欢迎大家访问):使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在,大模型已经渗透到各行各业,大模型也逐渐趋于平民化;从最开始对其理解、生成、强大的知识积累的惊叹&…

Android15之解决:Dex checksum does not match for dex:framework.jar问题(二百三十九)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

消息队列原理面试题及参考答案

什么是消息队列? 消息队列是一种在不同应用程序组件或者系统之间进行异步通信的中间件技术。它就像是一个信息的 “中转站”。从技术层面来讲,消息队列主要由消息生产者、消息队列本身和消息消费者这几个核心部分构成。 消息生产者负责创建消息并将其发送到消息队列中。这些消…

ubuntu16.04配置网卡

安装ubuntu16.04到最后选择安装服务时通过空格勾选 网卡 bond1 、集群内机器之间访问无网络限制 操作系统 raid1 数据盘得根据咱们的用途来看做raid几,如果用于ceph 就做单盘 raid0 ,其他做raid5 操作系统 bc-euler 21.10 及以上或者 bc-龙蜥 8.2以上…

css 溢出隐藏显示省略号

单行文字超出隐藏: 要使用CSS使超出容器的文本隐藏并以省略号显示,可以使用以下属性: overflow:hidden: 设置为 hidden 以隐藏超出容器的内容。 text-overflow:ellipsis: 设置为 ellipsis 以显示省略号。 white-space:nowrap: 设置为 nowr…

LLM学习笔记(5)微调 Fine-tuning

什么是微调(Fine-tuning)? 微调(Fine-tuning)是指在预训练模型(如 GPT)基础上,通过加入特定的数据对模型进行进一步训练,以优化其在某一特定任务或领域上的表现。它的主…

oracle配置

# 切换至oracle用户 [rootlocalhost ~]# su - oracle# 连接,以 DBA 用户身份登录 SQL*Plus [oracledb ~]$ sqlplus / as sysdba# 查看现有表空间名称及存放路径 SQL> SELECT file_name,tablespace_name FROM dba_data_files;-- 创建表空间 zf CREATE TABLESPACE zf DATAFILE…

【Unity基础】对比Unity中两种粒子系统

在Unity中,Particle System和Visual Effect Graph (VFX) 都是用于创建粒子效果的工具,但它们的设计目标、使用场景和功能特点有所不同。以下是详细对比: 1. Particle System 特点 传统粒子系统,Unity自带的模块化粒子特效工具。…

快速搭建Android开发环境:Docker部署docker-android并实现远程连接

目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…

CSS回顾-CSS选择器详解

一、引言 我来填坑啦!之前在CSS基础知识详解中介绍过,CSS 是一门基于规则的语言。是由选择器与样式信息组成:选择器 {样式信息}。CSS 选择器是 CSS 规则的关键,能精准定位 HTML 元素,CSS3 新增选择器更是增强了设计能…

第十二章 并行Stream流

目录 一、引言 二、获取并行Stream流的两种方式 三、并行和串行Stream流的效率对比 四、parallelStream线程安全问题 五、parallelStream背后的技术 5.1. Fork/Join框架介绍 5.2. Fork/Join原理-分治法 5.3. Fork/Join原理-工作窃取算法 5.4. Fork/Join案例 一、引言 …

gitlab cicd搭建及使用笔记(二)

cicd之gitlab-runner使用要点 官方链接:https://docs.gitlab.com/runner/ 附历史文章链接 https://blog.csdn.net/qq_42936727/article/details/143624523?spm1001.2014.3001.5501 gitlab-runner常用命令及解释 gitlab-runner verify 容器内,检查注…

2411rust,1.81,1.82

1.81.0稳定版 core::error::错误 1.81稳定了核心中的Error特征,允许在#![no_std]库中使用特征.这样在相同错误特征上,可标准化更广泛的Rust生态系统,而不管库的环境. 新的排序实现 都已按新算法更新了标准库中的稳定和不稳定排序实现,从而改进了它们的运行时性能和编译时间…

【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)

文章目录 前言一、自定义拦截器二、自定义操作1.自定义颜色1.1.样式未生效原因:1.2.解决方法: 2.合并单元格 三、复杂操作示例1.实体(使用了注解式样式):2.自定义拦截器3.代码4.最终效果 前言 本文简单介绍阿里的EasyExcel的复杂导出操作&…

Excel单元格中自适应填充多图

实例需求:在Excel插入图片时,由于图片尺寸各不相同,如果希望多个图片填充指定单元格,依靠用户手工调整,不仅费时费力,而且很难实现完全填充。如下图中的产品图册,有三个图片,如下图所…

SQL面试题——间隔连续问题

间隔连续问题 某游戏公司记录的用户每日登录数据如下 +----+----------+ | id| date| +----+----------+ |1001|2021-12-12| |1001|2021-12-13| |1001|2021-12-14| |1001|2021-12-16| |1001|2021-12-19| |1001|2021-12-20| |1002|2021-12-12| |1002|2021-12-16| |1002|…

【C++笔记】vector使用详解及模拟实现

前言 各位读者朋友们,大家好!上期我们讲了string类的模拟实现,这期我们开启vector的讲解。 一.vector的介绍及使用 1.1 vector的介绍 vector的文档 使用STL的三个境界:能用、明理、能扩展,下面学习vector&#xff…