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

自动化运维工具----Ansible playbook详解

一.Ansible playbook简介

1.playbook是ansible用于配置,部署,和管理被节点的剧本
2.通过playbook的详细描述,执行其中的一些列tasks,可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-list,而且被控节点必须要完成
3.playbook顾名思义,即剧本,现实生活中演员按照剧本表演,在ansible中,这次由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样的事情。

二.Ansible playbook使用场景

1.执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行的ad-hoc命令是不合适的,这时候最好使用playbook。
2.就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式
3.使用playbook可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写playbook,之后管理服务器会变得很简单。

三.Ansible playbook格式

格式简介

1.playbook由YAML语言编写。
2.YAML( /ˈjæməl/ )参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt Net与OrenBen-Kiki也是这语言的共同设计者。
3.YAML格式是类似JSON的文件格式。YAML用于文件的配置编写,JSON多用于开发设计。

YAML的格式如下:
1.文件的第一行应该以“---”(三个连字符)开始,表明YAML文件的开始。
2.在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
3.YAML中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。
4.同一个列表之中的元素应该保持相同的缩进,否则会被当做错误处理。
5.play中hosts、variables、roles、tasks等对象的表示方法都是以键值中间以“:”分隔表示,并且“:”之后要加一个空格。
host部分:使用hosts指示使用哪个主机或者主机组来运行下面的tasks,每个playbooks都必须指定hosts,host也可以使用通配符格式。主机或者主机组在inventorry清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i 选项指定清单的位置。在运行清单文件的时候, --list-hosts选项会显示哪些主机将会参与执行task的过程中。
remote_user:指定远端主机的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应的task权限。
tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法,tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,模块是必须的,同时也要给予模块相应的参数

4.使用ansible-playbook运行playbook文件,得到的输出信息中,信息内容为JSON格式,并且由不同的颜色组成,便于识别。

5.绿色代表执行成功,系统保持原样。黄色代表系统状态发生改变。红色代表执行失败,显示错误输出。

核心元素

  • Hosts:主机组

  • Tasks:任务列表

  • Variables:变量,设置方式有四种

  • Templates:包含了模块语法的文本文件

  • Handlers:由特定条件触发的任务。

基本组件

1.playbooks配置文件的基础组件

Hosts:运行指定任务的目标主机
remoute_user:在远程主机上执行任务的用户;
sudo_user:
tasks:任务列表tasks的具体格式:
tasks:- name: TASK_NAMEmodule: argumentsnotify: HANDLER_NAMEhandlers:- name: HANDLER_NAMEmodule: arguments 
##模块,模块参数:
格式如下:(1)action: module arguments(2) module: arguments
注意:shell和command模块后直接加命令,而不是key=value类的参数列表
handlers:任务,在特定条件下触发;接受到其他任务的通知时被触发;

2.在某个任务的状态在运行之后为changed时,可以通过“notify”通知相应的handlers;

3.任务可以通过“tags”打标签,而后可以在ansible-playbook命令上使用-t指定进行调用;

定义一个安装nginx的playbook

定义playbook

[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg  hosts  nginx.yml  roles
[root@ansible ansible]# vim nginx.yml 
---
- hosts: webremote_user: roottasks:- name: install nginx  ##安装模块。需要在被控主机里添加上nginx的源yum: name=nginx state=present- name: copy nginx.conf  ##复制nginx的配置文件过去,需要在本机的/tmp目录下编辑nginx.confcopy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yesnotify: reload ##当nginx.conf发生改变时,通知给相应的handerstags: reloadnginx- name: start nginx service  ##服务启动模块service: name=nginx state=startedtags: startnginx ##打标签handlers:- name: reloadservice: name=nginx state=restarted

测试运行结果

[root@ansible ansible]# ansible-playbook nginx.yml 
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [install nginx] *************************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
TASK [copy nginx.conf] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [start nginx service] *******************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172                 : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.1.1.173                 : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
##查看被控主机上的nginx服务
[root@ansible ansible]# ansible web -m shell -a 'netstat -natp|grep nginx'
10.1.1.173 | CHANGED | rc=0 >>
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      34304/nginx: master 
tcp6       0      0 :::80                   :::*                    LISTEN      34304/nginx: master 
10.1.1.172 | CHANGED | rc=0 >>
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      33550/nginx: master 
tcp6       0      0 :::80                   :::*                    LISTEN      33550/nginx: master 

测试标签,我们在nginx.yml中已经打了标签,所以可以直接应用标签,但是需要先将服务关闭,在运行剧本并且引用标签

##关闭被控节点的nginx服务
[root@ansible ansible]# ansible web -m shell -a 'systemctl stop nginx'
10.1.1.173 | CHANGED | rc=0 >>
10.1.1.172 | CHANGED | rc=0 >>
##重新加载剧本并应用标签
[root@ansible ansible]# ansible web -m shell -a 'systemctl stop nginx'
10.1.1.173 | CHANGED | rc=0 >>
10.1.1.172 | CHANGED | rc=0 >>
[root@ansible ansible]# ansible-playbook nginx.yml -t startnginx
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.173]
ok: [10.1.1.172]
TASK [start nginx service] *******************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
PLAY RECAP ***********************************************************************************************************
10.1.1.172                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.1.1.173                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

测试notify,在nginx.yml中做了一个notify,当配置文件改变时,条件就被戳发,我们修改一下/tem/nginx.conf的监听端口

##使用reloadnginx标签,重新加载剧本
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg  hosts  nginx.yml  roles
[root@ansible ansible]# ansible-playbook nginx.yml -t reloadnginx
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.173]
ok: [10.1.1.172]
TASK [copy nginx.conf] ***********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [reload] *********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172                 : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.1.1.173                 : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
##查看被控主机上nginx服务是否开启
[root@ansible ansible]# ansible web -m shell -a 'netstat -natp|grep nginx'
10.1.1.173 | CHANGED | rc=0 >>
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      35440/nginx: master 
10.1.1.172 | CHANGED | rc=0 >>
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      34688/nginx: master 

variables变量

variables变量有四种定义方法。如下:
facts:可以直接调用

1.ansible中有setup模块,这个模块就是通过facts组件来实现的。这里的variables也可以直接调用facts组件的facters我们可以使用setup模块来获取,然后直接放入我们的剧本之中调用即可
用户自定义变量

自定义变量有两种方式
通过命令行传入
ansible-playbook命令行中的 -e VARS,--extra-vars=VARS,这样就可以直接把自定义的变量传入

在playbook中定义变量

##在playbook中定义变量如下:
vars:- var1: value1- var2: value2

使用playbook定义变量,实例如下

定义剧本,将ngixn替换成变量

[root@ansible ansible]# cat nginx.yml 
---
- hosts: webremote_user: roottasks:- name: install {{ rpmname }}yum: name={{ rpmname }} state=present- name: copy {{ rpmname }}.confcopy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name={{ rpmname }} state=startedtags: start{{ rpmname }}handlers:- name: reloadservice: name={{ rpmname }} state=restarted

拷贝配置文件

##因为我们要安装keepalive服务,所以将keepalived的配置文件拷贝到/tmp目录下
##可以在本机上下载keepalived服务
[root@ansible ~]# cp /etc/keepalived/keepalived.conf /tmp/keepalived.conf

运行剧本,变量有命令行传入

[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg  hosts  nginx.yml  roles
##-e表示编辑yml内部变量
[root@ansible ansible]# ansible-playbook nginx.yml -e rpmname=keepalived
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [install keepalived] ********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
TASK [copy keepalived.conf] ******************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
TASK [start keepalived service] **************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [reload] *********************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
PLAY RECAP ***********************************************************************************************************
10.1.1.172                 : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.1.1.173                 : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

修改剧本直接定义变量,同样我们可以直接在剧本中定义好变量,这样就不需要再通过命令行传入。以后想要俺咋混给不同的服务,直接在剧本内部修改变量即可

[root@ansible ansible]# vim nginx.yml 
---
- hosts: webremote_user: rootvars:                     ##添加此处两行- rpmname: keepalived   ##定义rmpname变量值tasks:- name: install {{ rpmname }}yum: name={{ rpmname }} state=present- name: copy {{ rpmname }}.confcopy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name={{ rpmname }} state=startedtags: start{{ rpmname }}handlers:- name: reloadservice: name={{ rpmname }} state=restarted

运行定义过变量的剧本

[root@ansible ansible]# ansible-playbook nginx.yml 
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.173]
ok: [10.1.1.172]
TASK [install keepalived] ********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [copy keepalived.conf] ******************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [start keepalived service] **************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172                 : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.1.1.173                 : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

通过roles传递变量

  • 当说到roles时具体说明

Host Inventory

  • 我们也可以在主机清单中定义,方法如下:
#向不同的主机传递不同的变量
IP/HOSTNAME varaiable=value var2=value2
#向组中的主机传递相同的变量
[groupname:vars]
variable=value

模板templates

1.模板是一个文本文件,嵌套有脚本(使用模板编程语言编写)
2.Jinja2是python的一种模板语言,以Django的模板语言为原本
3.该模板支持:

 字符串:使用单引号或双引号;数字:整数,浮点数;列表:[item1, item2, ...]元组:(item1, item2, ...)字典:{key1:value1, key2:value2, ...}布尔型:true/false算术运算:+, -, *, /, //, %, **比较操作:==, !=, >, >=, <, <=逻辑运算:and, or, not

4.通常模板都是通过引用变量来运用的
实例如下

  • 定义模板
定义模板
[root@ansible ansible]# mv /tmp/nginx.conf /tmp/nginx.conf.j2
  • 修改剧本,如下两个地方
[root@ansible ansible]# vim nginx.yml 
---
- hosts: webremote_user: rootvars:- rpmname: nginxnginxport: 8888 ##修改此处tasks:- name: install {{ rpmname }}yum: name={{ rpmname }} state=present- name: copy {{ rpmname }}.conf##修改此处模板源地址copy: src=/tmp/{{ rpmname }}.conf.j2 dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yesnotify: reloadtags: reload{{ rpmname }}- name: start {{ rpmname }} serviceservice: name={{ rpmname }} state=startedtags: start{{ rpmname }}handlers:- name: reloadservice: name={{ rpmname }} state=restarted
  • 运行剧本
[root@ansible ansible]# ansible-playbook nginx.yml -t reloadnginx
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [copy nginx.conf] ***********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [reload] *********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
PLAY RECAP ***********************************************************************************************************
10.1.1.172                 : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.1.1.173                 : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

条件测试

  • when语句:在task中使用,jinja2的语法格式
tasks:- name: install conf file to centos8template: src=files/nginx.conf.c8.j2when: ansible_distribution_major_version == "8"- name: install conf file to centos7template: src=files/nginx.conf.c.j2when: ansible_distribution_major_version == "7"
  • 循环:迭代,需要重复执行的任务,对于迭代项的引用,固定变量名为"item",而后在task中使用with_items给定的迭代的元素列表
tasks:- name: unstall web packagesyum: name={{ item }} state=absentwith_items:- httpd- php- php-mysql

字典

ansible playbook也支持字典功能,举例如下

- name: install some packagesyum: name={{ item }} state=presentwith_items:- nginx- memcached- php-fpm- name: add some groupsgroup: name={{ item }} state=presentwith_items:- group11- group12- group13- name: add some usersuser: name={{ item.name }} group={{ item.group }} state=presentwith_items:- { name: 'user11',group: 'group11' }- { name: 'user12',group: 'group12' }- { name: 'user13',group: 'group13' }

角色定制

简介

1.对于以上所有方式有个缺点就是无法实现同时部署web、database、keepalived等不同服务或者不同服务器组合不同的应用就需要写多个yaml文件,很难实现灵活的调用
2.roles用于层次性,结构化地组织playbook。roles能够根据层次结果自动装载变量文件、tasks以及handlers等。
3.要使用roles只需要在playbook中使用include指令即可。
4.简单来讲,roles就是通过分别将变量(vars)、文件(files)、任务(tasks)、模块(modules)以及处理器(handlers)放置于单独的目录中,并且可以便捷的include它们地一种机制。
5.角色一般用于基于主机构建服务的场景中,但是也可以用于构建守护进程等场景中。

角色集合

roles/
mysql/:mysql服务的yml文件
httpd/:apached服务的yml文件
nginx/:nginx服务的yml文件
files/:存储由copy或者script等模块调用的文件或者脚本;
tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各个task;其他文件需要由main.yml进行包含调用;
handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各个handler;其他文件需要由main.yml进行包含调用;
vars/:此目录至少应该有一个名为main,yml的文件,用于定义各个variable;其他的文件需要由main.yml进行包含调用;
templates/:存储由templates模块调用的模板文件;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定以及依赖关系,其他文件需要由main.yml进行包含调用;
default/:此目录至少应该有一个名为main.yml的文件,用于设定默认变量;

角色定制实例

  • 在roles目录下生成对应的目录结构
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg  hosts  nginx.yml  roles
[root@ansible ansible]# cd roles/
[root@ansible roles]# ls
[root@ansible roles]# mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
[root@ansible roles]# tree
.
├── httpd
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
├── mysql
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
└── nginx├── default├── files├── handlers├── meta├── tasks├── templates└── vars
  • 定义配置文件
[root@ansible nginx]# pwd
/etc/ansible/roles/nginx
[root@ansible nginx]# ls
default  files  handlers  meta  tasks  templates  vars
[root@ansible nginx]# vim tasks/main.yml
- name: installyum: name=nginx state=latest
- name: conftemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.conftags: nginxconfnotify: new conf to reload
- name: start serviceservice: name=nginx state=started enabled=true
  • 放置需要的文件到指定目录下
[root@ansible nginx]# cp /tmp/nginx.conf.j2 /etc/ansible/roles/nginx/templates/
[root@ansible nginx]# tree
.
├── default
├── files
├── handlers
│   └── main.yml
├── meta
├── tasks
│   └── main.yml
├── templates
│   └── nginx.conf.j2
└── vars└── main.yml
  • 修改变量文件
[root@ansible nginx]# vim vars/main.yml
nginxport: 9999
  • 定义handler文件
[root@ansible nginx]# vim handlers/main.yml
- name: new conf to reloadservice: name=nginx state=restarted
  • 定义剧本文件
[root@ansible ansible]# pwd
/etc/ansible
[root@ansible ansible]# vim roles.yml
- hosts: webremote_user: rootroles:- nginx
  • 启动服务
[root@ansible ansible]# ansible-playbook roles.yml 
PLAY [web] ***********************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************
ok: [10.1.1.172]
ok: [10.1.1.173]
TASK [nginx : install] ***********************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
TASK [nginx : conf] **************************************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
TASK [nginx : start service] *****************************************************************************************
changed: [10.1.1.172]
changed: [10.1.1.173]
RUNNING HANDLER [nginx : new conf to reload] *************************************************************************
changed: [10.1.1.173]
changed: [10.1.1.172]
PLAY RECAP ***********************************************************************************************************
10.1.1.172                 : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.1.1.173                 : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
##验证是否部署成功,可以查看到9999端口
[root@ansible ansible]# ansible web -m shell -a 'ss -ntl'
10.1.1.173 | CHANGED | rc=0 >>
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:9999      0.0.0.0:*          
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*          
LISTEN 0      100        127.0.0.1:25        0.0.0.0:*          
LISTEN 0      128                *:80              *:*          
LISTEN 0      128             [::]:22           [::]:*          
LISTEN 0      100            [::1]:25           [::]:*          
10.1.1.172 | CHANGED | rc=0 >>
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:9999      0.0.0.0:*          
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*          
LISTEN 0      100        127.0.0.1:25        0.0.0.0:*          
LISTEN 0      128                *:80              *:*          
LISTEN 0      128             [::]:22           [::]:*          
LISTEN 0      100            [::1]:25           [::]:*    

相关文章:

自动化运维工具----Ansible playbook详解

一.Ansible playbook简介 1.playbook是ansible用于配置&#xff0c;部署&#xff0c;和管理被节点的剧本 2.通过playbook的详细描述&#xff0c;执行其中的一些列tasks&#xff0c;可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-lis…...

【element-ui】el-table表格高亮选中

highlight-current-row 是否要高亮当前行 <el-tableref"singleTable"highlight-current-rowcurrent-change"handleCurrentChange"></el-table>修改高亮行的颜色 .current-row {background-color: pink; }由current-change事件来管理选中时触发…...

构建MySQL数据库的高可用与高容错系统:关键策略与最佳实践

简介 在今天的数据驱动时代,数据库的高可用性(High Availability, HA)和高容错性(High Fault Tolerance)不再是可选项,而是每一个企业和应用都必须考虑的核心特性。特别是对于MySQL这样广泛使用的数据库系统,如何确保它能在各种故障面前保持持续可用,并且能迅速从故障…...

简析内部审计数字化转型的方法和路径【小落送书(第6期)】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…...

mysql和oracle数据库的区别与联系(值得收藏)

1、mysql和oracle都是关系型数据库。 mysql默认端口&#xff1a;3306 默认用户root oracle默认端口 1521 默认用户system mysql的安装配置和卸载简单&#xff0c;oracle比较麻烦&#xff0c;严重的可能要你重做系统。 oracle在命令行用命令登陆&#xff1a;sqlplus---然后录…...

vulhub中Wordpress 4.6 任意命令执行漏洞复现

由于Mysql初始化需要一段时间&#xff0c;所以请等待。成功运行后&#xff0c;访问http://your-ip:8080/打开站点&#xff0c;初始化管理员用户名和密码后即可使用&#xff08;数据库等已经配置好&#xff0c;且不会自动更新&#xff09;。 发送如下数据包&#xff0c;可见/tmp…...

ETCD分布式缓存

一、ETCD简介 ETCD是一个高度可用的分布式键值存储系统&#xff0c;主要用于共享配置和服务发现。它基于Go语言实现&#xff0c;内部使用Raft一致性算法处理日志复制&#xff0c;保证多节点数据的强一致性。 ETCD的目标是构建一个高可用的分布式键值数据库&#xff0c;用于存…...

【Linux】iftop命令详解

目录 一、iftop简介 二、安装iftop命令 2.1 命令查看测试环境系统信息 2.2 查看iftop版本与命令帮助 三、iftop的基本使用 3.1 直接使用iftop命令 3.2 iftop的显示说明 3.3 指定监控某块网卡 3.4 显示某个网段进出封包流量 3.5 按照流量排序 3.6 过滤显示连接 3.7 …...

【蓝桥杯】Excel地址

一.题目描述 二.问题分析 类似于进制转换 //Excel地址 #include <iostream> #include <stack> using namespace std;//const int N1e22; long long n; stack <char> s;int main(int argc, const char * argv[]) {ios::sync_with_stdio(0);cin.tie(0);cout.…...

Spring Boot 生成与解析Jwt

Spring Boot 生成与解析Jwt Maven依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>生成&解析 package yang;import io.jsonwebtoken.Claims…...

安卓Java面试题11-20

🔥 11、Android本身的API并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,如何解决?🔥 会,比如nullpointerException。我遇到过,比如textview.setText()时,textview没有初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出异常信…...

SSL 证书,了解一下常识

公司的网站、应用怎么才能保证在互联网上安全运行&#xff0c;不被攻击、盗取数据呢&#xff1f; 创业必经之路&#xff0c;一步一步走就对了&#xff0c;可能没赶上红利期&#xff0c;但不做就等于0。 概述 SSL 证书&#xff08;SSL Certificates&#xff09;又称数字证书&am…...

react tab选项卡吸顶实现

react tab选项卡吸顶实现&#xff0c;直接上代码&#xff08;代码有注释&#xff09; tsx代码 /* eslint-disable react-hooks/exhaustive-deps */ import React, { useEffect, useState } from "react"; import DocumentTitle from react-document-title import s…...

【数据结构】二、线性表:6.顺序表和链表的对比不同(从数据结构三要素讨论:逻辑结构、物理结构(存储结构)、数据运算(基本操作))

文章目录 6.对比&#xff1a;顺序表&链表6.1逻辑结构6.2物理结构&#xff08;存储结构&#xff09;6.2.1顺序表6.2.2链表 6.3数据运算&#xff08;基本操作&#xff09;6.3.1初始化6.3.2销毁表6.3.3插入、删除6.3.4查找 6.对比&#xff1a;顺序表&链表 6.1逻辑结构 顺…...

Golang单例模式学习笔记

前言 单例模式是常用的一种设计模式&#xff0c;一般用于比如客户端、连接的创建等&#xff0c;防止创建多个导致性能消耗。所以我认为单例模式的核心&#xff0c;就是“防止重复”。本文将在Golang中进行单例模式的实现。 实现 版本1——检测-创建 最基础的版本&#xff0…...

Leetcode HOT150

55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1 …...

仿牛客项目Day1

SpringMVC 架构 spring的前端控制器是DispatcherServlet 模板引擎Thymeleaf 这个还不知道干嘛的 mvc演示 get请求 RequestMapping&#xff1a;声明访问路径和http方法get或set什么的 ResponseBody&#xff1a;java对象转为json格式的数据&#xff0c;表示该方法的返回结…...

Effective C++ 学习笔记 条款17 以独立语句将newed对象置入智能指针

假设我们有个函数用来揭示处理程序的优先权&#xff0c;另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理&#xff1a; int priority();void processWidget(std::st1::shared_ptr<Widget> pw, int priority);由于谨记“以对象管理资源”&#xff08;条…...

通过Electron打包前端项目为exe

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;爱蹦跶的大A阿 &#x1f525;当前正在更新专栏&#xff1a;《JavaScript保姆级教程》、《VUE》、《Krpano》 ✨ 正文 1、 拉取electron官网上的demo&#xff0c;拉下来之后安装依赖&#xff0c;项目跑起来之后&#xff0c;就…...

大模型时代企业知识全生命周期管理解决方案

©作者|Zhongmei 来源|神州问学 摘 要 越来越多的企业开始意识到数据的重要性。同时意识到&#xff0c;企业想保持长远的发展&#xff0c;还需要协调组织协作、利用现有的数据沉淀经验知识、累积数据资产。据IDC调查&#xff0c;目前企业结构化数据仅占到全部数据量的20%…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...