Ansible playbook 详解与实战操作
一、概述
-
playbook
与ad-hoc
相比,是一种完全不同的运用 ansible 的方式,类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用,playbook 可以持久使用。 -
playbook
是由一个或多个 play 组成的列表,play 的主要功能在于将事先归并为一组的主机装扮成事先通过 ansible 中的 task 定义好的角色。 -
从根本上来讲,所谓的 task 无非是调用 ansible 的一个 module。将多个 play 组织在一个 playbook 中,即可以让它们联合起来按事先编排的机制完成某一任务。
参考文档:https://ansible-tran.readthedocs.io/en/latest/docs/playbooks.html
Ansible 的基础介绍和环境部署可以参考这篇文章:
二、playbook 核心元素
-
Hosts
执行的远程主机列表 -
Tasks
任务集 -
Varniables
内置变量或自定义变量在 playbook 中调用 -
Templates
模板,即使用模板语法的文件,比如配置文件等 -
Handlers
和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 -
Tags
标签,指定某条任务执行,用于选择运行 playbook 中的部分代码。
三、playbook 语法(yaml)
-
playbook 使用
yaml
语法格式,后缀可以是yaml
,也可以是yml
。 -
YAML( /ˈjæməl/ )参考了其他多种语言,包括:XML、C 语言、Python、Perl 以及电子邮件格式 RFC2822,Clark Evans 在 2001 年 5 月在首次发表了这种语言,另外 Ingy döt Net 与 OrenBen-Kiki 也是这语言的共同设计者。
-
YAML 格式是类似 JSON 的文件格式。YAML 用于文件的配置编写,JSON 多用于开发设计。
1)YAML 介绍
1、YAML 格式如下
-
文件的第一行应该以“---”(三个连字符)开始,表明 YAML 文件的开始。
-
在同一行中,#之后的内容表示注释,类似于 shell,python 和 ruby。
-
YAML 中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。
-
同一个列表之中的元素应该保持相同的缩进,否则会被当做错误处理。
-
play 中 hosts、variables、roles、tasks 等对象的表示方法都是以键值中间以“:”分隔表示,并且“:”之后要加一个空格。
2、playbooks yaml 配置文件解释
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:任务,在特定条件下触发;接受到其他任务的通知时被触发;
3、示例
---
- 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发生改变时,通知给相应的handlerstags: reloadnginx #打标签- name: start nginx service #服务启动模块service: name=nginx state=startedtags: startnginx #打标签handlers:- name: reloadservice: name=nginx state=restarted
2)variables 变量
variables 变量有四种定义方法。如下:
1、facts:可以直接调用
ansible 中有 setup 模块,这个模块就是通过 facts 组件来实现的,主要是节点本身的一个系统信息,bios 信息,网络,硬盘等等信息。这里的 variables 也可以直接调用 facts 组件的 facters 我们可以使用setup
模块来获取,然后直接放入我们的剧本之中调用即可。
ansible web -m setup
常用的几个参数:
ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的cpu的核数(每颗)
ansible_processor_count #系统cpu的颗数
ansible_processor_vcpus #系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python
搜索
ansible web -m setup -a 'filter=*processor*'
2、用户自定义变量
自定义变量有两种方式
-
通过命令行传入
ansible-playbook命令行中的 -e VARS,--extra-vars VARS,这样就可以直接把自定义的变量传入
使用 playbook 定义变量,实例如下:
---
- 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
使用:
ansible-playbook nginx.yml -e rpmname=keepalived
ansible-playbook nginx.yml --extra-vars rpmname=keepalived
-
在 playbook 中定义变量
##在playbook中定义变量如下:
vars:- var1: value1- var2: value2
使用:
---
- hosts: webremote_user: rootvars:- rpmname: keepalivedtasks:- 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
3、通过 roles 传递变量
下面介绍 roles 会使用 roles 传递变量,小伙伴可以翻到下面看详解讲解。
4、 Host Inventory
可以在主机清单中定义,方法如下:
#向不同的主机传递不同的变量
IP/HOSTNAME varaiable=value var2=value2#向组中的主机传递相同的变量
[groupname:vars]
variable=value
3)流程控制
1、用 when 来表示的条件判断
- hosts: webremote_user: root#代表用root用户执行,默认是root,可以省略tasks:- name: createfilecopy: content="test3" dest=/opt/p1.ymlwhen: a=='3'- name: createfilecopy: content="test4" dest=/opt/p1.ymlwhen: a=='4'
如果 a"3",就将“test3”,写入到 web 组下被管控机的/opt/p1.yml 中,
如果 a"4",就将“test4”,写入到 web 组下被管控机的/opt/p1.yml 中。
执行
# 语法校验
ansible-playbook --syntax-check p1.yml#执行
ansible-playbook -e 'a="3"' p1.yml
2、标签(只执行配置文件中的一个任务)
- hosts: webtasks:- name: installnginxyum: name=nginx- name: copyfilecopy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conftags: copyfile- name: startservice: name=nginx static=restarted
执行
# 语法校验
ansible-playbook --syntax-check p2.yml#执行
ansible-playbook -t copyfile p2.yml
3、循环 with_items
创建三个用户
- hosts: webtasks:- name: createruseruser: name={{ item }}with_items:- shy1- shy2- shy3- name: creategroupgroup: name={{ item }}with_items:- group1- group2- group3
执行
#语法校验
ansible-playbook --syntax-check p3.yml#执行
ansible-playbook p3.yml
4、循环嵌套(字典)
用户 shy1 的属组是 group1,用户 shy2 的属组是 group2,用户 shy3 的属组是 group3
- hosts: webtasks:- name: creategroupgroup: name={{item}}with_items:- group3- group4- group5- name: createuseruser: name={{item.user}} group={{item.group}}with_items:- {'user': shy3,'group': group3}- {'user': shy4,'group': group4}- {'user': shy5,'group': group5}
执行
#语法校验
ansible-playbook --syntax-check p4.yml#执行
ansible-playbook p4.yml
4)模板 templates
-
模板是一个文本文件,嵌套有脚本(使用模板编程语言编写)
-
Jinja2 是 python 的一种模板语言,以 Django 的模板语言为原本
该模板支持:
字符串:使用单引号或双引号;数字:整数,浮点数;列表:[item1, item2, ...]元组:(item1, item2, ...)字典:{key1:value1, key2:value2, ...}布尔型:true/false算术运算:+, -, *, /, //, %, **比较操作:==, !=, >, >=, <, <=逻辑运算:and, or, not
-
通常模板都是通过引用变量来运用的
【示例】
1、定义模板
user nginx; #设置nginx服务的系统使用用户
worker_processes {{ ansible_processor_vcpus }}; #工作进程数error_log /var/log/nginx/error.log warn; #nginx的错误日志
pid /var/run/nginx.pid; #nginx启动时候的pidevents {worker_connections 1024; #每个进程允许的最大连接数
}http { #http请求配置,一个http可以包含多个server#定义 Content-Typeinclude /etc/nginx/mime.types;default_type application/octet-stream;#日志格式 此处main与access_log中的main对应#$remote_addr:客户端地址#$remote_user:http客户端请求nginx认证的用户名,默认不开启认证模块,不会记录#$timelocal:nginx的时间#$request:请求method + 路由 + http协议版本#status:http reponse 状态码#body_bytes_sent:response body的大小#$http_referer:referer头信息参数,表示上级页面#$http_user_agent:user-agent头信息参数,客户端信息#$http_x_forwarded_for:x-forwarded-for头信息参数log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';#访问日志,后面的main表示使用log_format中的main格式记录到access.log中access_log /var/log/nginx/access.log main;#nginx的一大优势,高效率文件传输sendfile on;#tcp_nopush on;#客户端与服务端的超时时间,单位秒keepalive_timeout 65;#gzip on;server { #http服务,一个server可以配置多个locationlisten {{ nginxport }}; #服务监听端口server_name localhost; #主机名、域名#charset koi8-r;#access_log /var/log/nginx/host.access.log main;location / {root /usr/share/nginx/html; #页面存放目录index index.html index.htm; #默认页面}#error_page 404 /404.html;# 将500 502 503 504的错误页面重定向到 /50x.htmlerror_page 500 502 503 504 /50x.html;location = /50x.html { #匹配error_page指定的页面路径root /usr/share/nginx/html; #页面存放的目录}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}include /etc/nginx/conf.d/*.conf;
}
2、定义 yaml 编排
---
- hosts: webremote_user: rootvars:- rpmname: nginx- nginxport: 8088tasks:- 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
使用
##使用reloadnginx标签,重新加载剧本
ansible-playbook nginx.yml -t reloadnginx
copy 与 template 的区别
-
copy 模块不替代参数,template 模块替代参数
-
template 的参数几乎与 copy 的参数完全相同
5)handlers(触发事件)
notify:触发
handlers:触发的动作
使用上场景:修改配置文件时
【示例】 正常情况时 handlers 是不会执行的
- hosts: webtasks:- name: installredisyum: name=redis- name: copyfiletemplate: src=redis.conf dest=/etc/redis.conftags: copyfilenotify: restart- name: startservice: name=redis state=startedhandlers:- name: restartservice: name=redis
执行
ansible-playbook -t copyfile p6.yml
6)roles
1、roles 介绍与优势
一般情况下将 roles 写在**/etc/ansible/roles**中,也可以写在其他任意位置(写在其他位置要自己手动建立一个 roles 文件夹)
-
对于以上所有方式有个缺点就是无法实现同时部署 web、database、keepalived 等不同服务或者不同服务器组合不同的应用就需要写多个 yaml 文件,很难实现灵活的调用
-
roles 用于层次性,结构化地组织 playbook。roles 能够根据层次结果自动装载变量文件、tasks 以及 handlers 等。
-
要使用 roles 只需要在 playbook 中使用 include 指令即可。
-
简单来讲,roles 就是通过分别将变量(vars)、文件(files)、任务(tasks)、模块(modules)以及处理器(handlers)放置于单独的目录中,并且可以便捷的 include 它们地一种机制。
-
角色一般用于基于主机构建服务的场景中,但是也可以用于构建守护进程等场景中。
2、目录结构
创建目录
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
-
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的文件,用于设定默认变量;
3、实战操作
【1】创建目录
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
【2】定义配置文件
先下载 nginx rpm 部署包
# 下载地址:http://nginx.org/packages/centos/7/x86_64/RPMS/wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm -O nginx/files/nginx-1.18.0-1.el7.ngx.x86_64.rpm
-
nginx/tasks/main.yml
- name: cpcopy: src=nginx-1.18.0-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm
- name: installyum: name=/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm 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
- nginx/templates/nginx.conf.j2
user nginx; #设置nginx服务的系统使用用户
worker_processes {{ ansible_processor_vcpus }}; #工作进程数error_log /var/log/nginx/error.log warn; #nginx的错误日志
pid /var/run/nginx.pid; #nginx启动时候的pidevents {worker_connections 1024; #每个进程允许的最大连接数
}http { #http请求配置,一个http可以包含多个server#定义 Content-Typeinclude /etc/nginx/mime.types;default_type application/octet-stream;#日志格式 此处main与access_log中的main对应#$remote_addr:客户端地址#$remote_user:http客户端请求nginx认证的用户名,默认不开启认证模块,不会记录#$timelocal:nginx的时间#$request:请求method + 路由 + http协议版本#status:http reponse 状态码#body_bytes_sent:response body的大小#$http_referer:referer头信息参数,表示上级页面#$http_user_agent:user-agent头信息参数,客户端信息#$http_x_forwarded_for:x-forwarded-for头信息参数log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';#访问日志,后面的main表示使用log_format中的main格式记录到access.log中access_log /var/log/nginx/access.log main;#nginx的一大优势,高效率文件传输sendfile on;#tcp_nopush on;#客户端与服务端的超时时间,单位秒keepalive_timeout 65;#gzip on;server { #http服务,一个server可以配置多个locationlisten {{ nginxport }}; #服务监听端口server_name localhost; #主机名、域名#charset koi8-r;#access_log /var/log/nginx/host.access.log main;location / {root /usr/share/nginx/html; #页面存放目录index index.html index.htm; #默认页面}#error_page 404 /404.html;# 将500 502 503 504的错误页面重定向到 /50x.htmlerror_page 500 502 503 504 /50x.html;location = /50x.html { #匹配error_page指定的页面路径root /usr/share/nginx/html; #页面存放的目录}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}include /etc/nginx/conf.d/*.conf;
}
-
nginx/vars/main.yml
nginxport: 9999
-
nginx/handlers/main.yml
- name: new conf to reloadservice: name=nginx state=restarted
-
定义剧本文件(roles.yml)
- hosts: webremote_user: rootroles:- nginx
最后的目录结构如下:
执行
ansible-playbook roles.yml
到这里一个完整版的 roles 演示示例就完成了,接下来也会真正使用 ansible playbook roles 应用到真实场景中
相关文章:
Ansible playbook 详解与实战操作
一、概述 playbook 与 ad-hoc 相比,是一种完全不同的运用 ansible 的方式,类似与 saltstack 的 state 状态文件。ad-hoc 无法持久使用,playbook 可以持久使用。 playbook 是由一个或多个 play 组成的列表,play 的主要功能在于将事先归并为一…...
linux普通用户使用sudo不需要输密码
1.root用户如果没有密码,先给root用户设置密码 sudo passwd root #设置密码 2.修改visudo配置 su #切换到root用户下 sudo visudo #修改visudo配置文件 用户名 ALL(ALL) NOPASSWD: ALL #下图所示处新增一行配置 用户名需要输入自己当前主机的用户名...
linux-----数据库
Linux下数据库概述 数据库类型: 关系型数据库(RDBMS):如MySQL、PostgreSQL、Oracle等。这些数据库以表格的形式存储数据,表格之间通过关系(如主键 - 外键关系)相互关联。关系型数据库支持复杂的…...
【Linux进程】进程间的通信
目录 1. 进程间通信 1.1 进程间通信的目的 2. 管道 2.1 什么是管道 2.2. 匿名管道 匿名管道的特性 管道的4种情况 联系shell中的管道 2.3. 命名管道 代码级建立命名管道 2.4. 小结 总结 1. 进程间通信 进程间通信(Inter-Process Communication,IPC&…...
面试题整理4----lvs,nginx,haproxy区别和使用场景
LVS、Nginx、HAProxy:区别与使用场景 1. LVS(Linux Virtual Server)1.1 介绍1.2 特点1.3 使用场景 2. Nginx2.1 介绍2.2 特点2.3 使用场景 3. HAProxy3.1 介绍3.2 特点3.3 使用场景 4. 总结对比 在构建高可用、高性能的网络服务时,…...
开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述
定义 开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)是一种目标检测任务,旨在检测和识别那些未在训练集中明确标注的物体类别。传统的目标检测模型通常只能识别有限数量的预定义类别,而OVOD模型则具有识别“开放词汇…...
Python读写JSON文件
import jsondef writeJSONFile(self):with open(g_updateFilePath, "w" encodingutf-8) as fiel:json.dump(dictData, fiel, indent4, ensure_asciiFalse)fiel.close()def readJsonToDict(file):with open(file, r, encodingutf-8) as f: # 确保文件以 UTF-8 编码打…...
使用Python开发高级游戏:创建一个3D射击游戏
在这篇文章中,我们将深入介绍如何使用Python开发一个简单的3D射击游戏。我们将使用Pygame库来创建2D游戏界面,并结合PyOpenGL来进行3D渲染。这个项目的目标是帮助你理解如何将2D和3D图形结合起来,创建更复杂的游戏机制,包括玩家控制、敌人AI、碰撞检测和声音效果。 一、开…...
springboot 配置Kafka 关闭自启动连接
这里写自定义目录标题 springboot 配置Kafka 关闭自启动连接方法一:使用 ConditionalOnProperty方法二:手动管理Kafka监听器容器方法三:使用 autoStartupfalse结语 springboot 配置Kafka 关闭自启动连接 在Spring Boot应用程序中,…...
Jenkins中添加节点实战
Jenkins是一个开源的自动化服务器,用于持续集成和持续交付(CI/CD)。为了提高构建和测试的效率,我们可以在Jenkins中添加节点(也称为代理或从属节点)。本文将详细介绍如何在Jenkins中添加节点,包括安装Java 11、Git、设置凭证、多种配置Jenkins Agent的方法以及验证。 …...
DL作业11 LSTM
习题6-4 推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果 LSTM(长短期记忆网络)是一种特殊的循环神经网络(RNN),旨在解决普通 RNN 在处理长序列时遇到的梯度消失和梯度爆炸问题。它通过设计多个门…...
用 Python 实现井字棋游戏
一、引言 井字棋(Tic-Tac-Toe)是一款经典的两人棋类游戏。在这个游戏中,玩家轮流在 3x3 的棋盘上放置自己的标记,通常是 “X” 和 “O”,第一个在棋盘上连成一线(横、竖或斜)的玩家即为获胜者。…...
构建MacOS应用小白教程(打包 签名 公证 上架)
打包 在package.json中,dependencies会被打进 Electron 应用的包里,而devDependencies则不会,所以必要的依赖需要放到dependencies中。files中定义自己需要被打进 Electron 包里的文件。以下是一个完整的 mac electron-builder的配置文件。 …...
如何高效使用 Facebook Business Manager (商务管理平台)
在数字营销的浪潮中,Facebook Business Manager(商务管理平台)已成为众多企业管理社交广告活动、品牌资产和团队协作的核心工具。无论你是刚刚进入社交广告领域的小型企业主,还是经验丰富的大型品牌经理,掌握 Facebook…...
每天学习一个思维模型 - 损失规避
定义 损失规避(Loss aversion),又称损失厌恶,指人们面对同样数量的利益和损失时,认为损失更加令他们难以忍受。损失带来的负效用为收益正效用的2至2.5倍。损失厌恶反映了人们的风险偏好并不是一致的,当涉及…...
Python知识分享第三十一天-Numpy和Pnadas入门
NumPy Numpy介绍 Numpy是Python中科学计算的基础包,它是一个Python库提供多维数组对象 各种派生对象(如掩码数组和矩阵),以及用于对数组进行快速的各种例程,包括数学 ,逻辑, 形状操作,排序,选择,I/O,离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等等(Numpy的核心是nda…...
mlr3超参数Hyperparameter 自动寻找auto
底层还是根据你本来在R跑单独那一个机器学习的函数,例如randomForest::randomForest(),里面可以填入什么,然后跟你的实际数据取值范围去设个范围。然后用auto_tuner()函数对学习器的超参数自动调参 随机森林randomforest learner_rf <- …...
双臂机器人
目录 一、双臂机器人简介 二、双臂机器人系统的组成 三、双臂机器人面临的主要挑战 3.1 协调与协同控制问题 3.2 力控制与柔顺性问题 3.3 路径规划与轨迹优化问题 3.4 感知与环境交互 3.5 人机协作问题 3.6 能源与效率问题 3.7 稳定性与可靠性问题 四、双臂机器人…...
MATLAB中cvx工具箱的使用
CVX 是 MATLAB 中一个用于解决凸优化问题的建模工具箱。它使得定义、求解和分析凸优化问题变得简单。CVX 允许用户用类似数学表达的方式编写凸优化问题,而不需要过多关注底层的优化算法。CVX 的核心功能是将一个简单的数学问题转化为 MATLAB 可以理解并求解的标准形…...
EGO Swarm翻译
目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …...
Webpack简单介绍及安装
一、介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。它将应用程序中的所有依赖项(JavaScript、图片、CSS 等)打包成一个或多个 bundle。这样做的主要目的是减少加载时间和提高应用程序的加载性能…...
如何在Anaconda的虚拟环境中下载Python包
一、首先查看conda下的虚拟环境 使用conda info -e查看当前conda下的虚拟环境: conda info -e 二、激活要添加Python包的虚拟环境 其中base是基础环境,这里我们选择conda_env这个虚拟环境 conda activate conda_env 三、使用conda命令安装需要的Pyth…...
React 事件机制和原生 DOM 事件流有什么区别
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 React 的事件机制与原生 DOM 事件流在设计和实现上有一些显著的区别。了解这些区别有助于我们更好地理解 React 是如何管理事件的…...
React 底部加载组件(基于antd)
底部加载组件的意义在于提供一种流畅的用户体验,以便在用户滚动到页面底部时自动加载更多内容。这样可以让用户无需离开当前页面,就能够无缝地浏览更多的内容.通过底部加载组件,可以分批加载页面内容,减少一次性加载大量数据对页面…...
Redis应用—7.大Value处理方案
1.⽅案设计 步骤一:首先需要配置一个crontab定时调度shell脚本,然后该脚本每天凌晨会通过rdbtools⼯具解析Redis的RDB⽂件,接着对解析出的内容进行过滤,把RDB⽂件中的⼤key导出到CSV⽂件。 步骤二:使⽤SQL导⼊CSV⽂件到…...
洛谷P2742 圈奶牛 (凸包 Andrew算法)
[USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包 题目背景 upd: 新增一组 hack 数据。 题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算…...
Spring(一)---IOC(控制权反转)
目录 引入 1.什么叫IOC(Inversion of Control)控制权反转? 2.什么叫AOP(Aspect-Oriented Programming)面向切面编程(涉及Java代理)? 3.简单谈一下Java怎么实现ICO? Spring框架的介绍 1. Spring框架的概述 2. Spring框架的优点 Spring IOC容器介绍…...
MySQL数据库——门诊管理系统数据库数据表
门诊系统数据库his 使用图形化工具或SQL语句在简明门诊管理系统数据库his中创建数据表,数据表结构见表2-3-9~表2-3-15所示。 表2-3-9 department(科室信息表) 字段名称 数据类型 长度 是否为空 说明 dep_ID int 否 科室…...
linux环境使用yum方式安装nginx
linux环境使用yum方式安装nginx 一、nginx官网 二、nginx安装 点击首页的 Docs 或者 install 都可以,最终都是进入到Installing nginx页面 因为安装的服务器环境是linux centos 所以选择 Installation on Linux下面 packages 跳转链接 点击packages后 最终会跳转…...
2024高级前端面试题大全
🎨 1、v-bind指令绑定所有属性 <comp :title"title" :color"color" /><comp v-bind"props" />🎨 父组件监听字组件渲染周期:hook:updated文章地址🎨 Vue3 defineAsyncComponent动态导…...
[机器学习]XGBoost(3)——确定树的结构
XGBoost的目标函数详见[机器学习]XGBoost(2)——目标函数(公式详解) 确定树的结构 之前在关于目标函数的计算中,均假设树的结构是确定的,但实际上,当划分条件不同时,叶子节点包含的…...
Hutool工具包的常用工具类的使用介绍
前言 Hutool 是一个轻量级的 Java 工具类库,提供了非常丰富的工具方法,可以大大减少开发时的重复性工作。它的目标是让 Java 开发更简单、更高效。Hutool 提供了多种常用功能,以下是一些常用工具类的使用介绍: 1. StrUtil - 字符…...
ETCD备份还原
环境准备: master 192.168.8.128 node1 192.168.8.129 k8s版本: 一:安装etcdctl工具 1.1下载安装包: wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz 1.2解压&…...
服务器防火墙设置某个端口号只允许固定 ip地址访问
服务器防火墙设置某个端口号只允许固定 ip地址访问是运维常见的功能,今天我们分享一下: 一、Linux环境 1、firewall 方式 1)允许特定 IP 地址访问 23 端口 sudo firewall-cmd --zonepublic --add-rich-rulerule family"ipv4" s…...
FPGA 基础了解
前言 前期一直在做关于FPGA方面的开发,从开始认真玩FPGA到参考原子、野火、黑金、米联客的教学资料再到参与做项目中,中途也参加了两个比赛整也都获得不错的成绩,整个阶段持续了大概快一年半的时间,学习了乱七八糟的知识…...
Golang学习历程【第二篇 fmt包变量、常量的定义】
Golang学习历程【第二篇 fmt包&变量、常量的定义】 1. fmt 包1.1 打印(print)1.1.1 Print 打印1.1.2 Println 打印后换行1.1.3 Printf 打印格式化参数 1.2 输入(Scan)1.2.1 Scan 输入1.2.2 Scanf 格式化输入 2. 变量2.1 变量的声明2.2 变量初始化&am…...
深入QML语法
文章目录 深入了解 QML 文档的结构和语法什么是 QML 文档?导入语句导入语句的格式示例 对象声明基本语法示例更复杂的对象声明 QML 对象类型详解1. Rectangle(矩形)2. Gradient(渐变)3. Text(文本ÿ…...
Viggle Api上线V3-beta模型,圣诞节跳舞视频来临
历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务 万物皆能舞,AI让你秒变“舞”林高手 – Viggle AI“舞”所不能 Viggle AI:打造爆款 AI 视频,让照片 “踢” 起足球 又一款AI对口型神器,让…...
前端excel的实现方案Luckysheet
一、介绍 Luckysheet是一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源的插件。目前已暂停维护,但是其已有功能大概能满足常见需求的使用。 二、引入 ①cdn引入(目前应该已经不支持,可自行尝试) <l…...
数据字典类型/条目表的设计目的
1.以前的设计思路 对于下拉框选项储存的思路 我们以前是直接针对每一个下拉框都关联一个表格于数据库中 这种行为很不妥当 如果对于不同业务情景下的相同下拉框来说 多个相同下拉框就会在数据库中产生多个表格 当某个下拉框的选项需要更新或者新增时 那么对应的需要同步更新相…...
abc 383 C (bfs 最短路 )D(唯一分解定理,欧拉筛)
C 题: 首先暴力的想,对于每一个加湿器的位置去 上下左右扩展是 nm 的复杂度 。最多会有 nm 个加湿器。所以复杂度到达了n^3 。肯定超时了。 我们可以发现 对于一个点 会标记很多次,这回导致超时。 可以采用类似 bfs 求最短路的形式ÿ…...
常用消息中间件介绍
在消息中间件这个领域,确实有不少专业且强大的选择,它们各自都有着独特的优势和适用场景。 1. Apache Kafka: • Kafka以其高吞吐量、低延迟和分布式架构著称,非常适合处理大数据量、实时性要求高的场景。 • 它支持发布/订阅模式…...
vue基础
1.v-text,v-html <!-- v-text,v-html都可以显示内容 ,v-html可以解析html标签--> <p>{{msg}}</p> <p v-text"msg"></p> <p v-html"msg"></p> <script> let appnew Vue({ el:"#max", data:{ ms…...
从Windows远程访问Linux上的数据库
从Windows远程访问Linux上的数据库 目录 简介在Linux上安装MySQL/MariaDB配置MySQL/MariaDB以允许远程连接 修改MySQL/MariaDB配置文件重启MySQL/MariaDB服务确保防火墙允许MySQL/MariaDB端口 创建远程访问用户授予用户权限测试远程连接 检查网络连通性使用图形化工具连接 创…...
Android HandlerThread、Looper、MessageQueue 源码分析
Android HandlerThread、Looper、MessageQueue 源码分析 简介 在 Android 开发中,大家应该对 HandlerThread 有一定了解。顾名思义,HandlerThread 是 Thread 的一个子类。与普通的 Thread 不同,Thread 通常一次只能执行一个后台任务&#x…...
ASP.NET |日常开发中定时任务详解
ASP.NET |日常开发中定时任务详解 前言一、定时任务的概念与用途1.1 定义1.2 应用场景 二、在ASP.NET中实现定时任务的方式2.1 使用System.Timers.Timer2.2 使用Quartz.NET 三、定时任务的部署与管理3.1 部署考虑因素3.2 管理与监控 结束语优质源码分享 ASP.NET &am…...
Unity动态读取外部图片转Texture2D,内存过大问题解决方案
问题描述 加载原始图片2.63M的图片,分辨率为3023*4032,占用内存108.5M 加载原始图片12.6 M的图片,分辨率为6000*8000,占用内存427.2M 太恐怖了吧 解决方案 1.加载完图片,等比缩放,宽高改为1024或者512以下 1024占用5.2M,512占用1.3M,相比小了很多 2.原始Texture2…...
【Where语法全解密】.NET开源ORM框架 SqlSugar 系列
文章目录 前言一、普通表达式查询 Where二、根据SQL查询 where三、动态查询四、动态拼表达式查询 ,拼拉姆达五、条件拼接查询六、链式条件查询七、根据Class查询,根据实查询八、根据Class中主键查询九、根据字典查询十、查询函数十一、Where中有子查询十…...
人工智能练习题--大题题库速通指南
随着人工智能(AI)技术的快速发展,越来越多的企业和个人开始重视AI的应用和发展。在这个背景下,人工智能训练师这一职业应运而生,他们专注于数据标注、模型训练、算法优化等方面的工作,以确保AI系统能够准确…...
写给Pythoner的前端进阶指南(四):异步编程 - 原生支持的 async/await
在开发中,异步编程是处理并发任务的重要方式。无论是请求数据、读取文件还是执行网络操作,异步编程能够有效提升程序的性能和响应速度。Python 和 JavaScript 都支持异步编程,但它们的实现方式有所不同。在这篇文章中,我们将深入探…...