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

Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

目录

一、ansible概述

1、简介

2、Ansible主要功能:

3、Ansible的另一个特点:所有模块都是幂等性

4、Ansible的优点:

5、Ansible的四大组件:

二、ansible环境部署:

1、环境:

2、安装ansible:

3、Ansible的配置文件:

4、 配置远程主机清单

三、ansible的模块(重要)

1、ansible的命令格式:

2、模块1:command模块

3、模块二:shell模块

4、模块3:cron模块

5、模块4:USER模块

6、模块5:group模块(了解)

7、模块6:ping模块

8、模块7:hostname模块

9、模块8:COPY模块

10、模块9:file模块

11、模块10:yum模块

12、模块11:service/systemd模块

13、模块12:script模块

14、模块13:setup模块

四、管理主机清单

1、主机变量

2、组变量

3、组嵌套


一、ansible概述

1、简介


Ansible是自动化运维工具,能实现跨主机对应用编排管理部署。

Ansible能批量配置、部署、管理上千台主机,是应用级别的跨主机编排工具。

比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起

2、Ansible主要功能:

远程操控主机功能

自动化运维(playbook剧本yaml格式)

Ansible能批量的配置、部署、管理上千台主机。类似于xshell的一键输入的工具,不需要每次都切换主机进程操作,只要有一台Ansible的固定主机,就可以实现所有节点的操作

不需要agent(客户端)的概念,只需要一台主机上配置了Ansible即可

Ansible是基于模块来进行工作的,只是提供了一种运行的架构,真正执行操作和变更的是Ansible的模块来实现的。

Ansible默认是通过ssh的密钥对实现通信。(可以改)

3、Ansible的另一个特点:所有模块都是幂等性

所谓幂等性,指的是多次操作和多次执行对系统资源的影响是一致的

systemctl stop firewalld 是幂等性

systemctl restart firewalld不是幂等性

http的get是幂等性

http的post不是幂等性

Ansible的幂等性,决定了你可以放心大胆的使用,重复执行摸个任务不会对结果产生任何影响(绝大多数情况)

4、Ansible的优点:

部署较为简单,只要在控制主机部署即可。被控制主机需要有ssh和python2.5以上版本。基本上Linux虚拟机都能满足这两个

Ansible只能控制Linux系统,Windows不行

基于模块工作,可以使用任意语言开发模块(二次开发,底层架构)

5、Ansible的四大组件:

  1. inventory主机清单(主机组):定义Ansible可以远程操作的服务器
  2. 模块:常用的有13个模块。通过模块可以实现远程的配置和操作
  3. plugins插件
  4. playbook:基本(shell脚本)yaml格式

二、ansible环境部署:

1、环境:

        管理端:20.0.0.21 Ansible

        被管理端:20.0.0.22、20.0.0.23

2、安装ansible:

基于epel源安装
先安装 epel 源
yum install -y epel-releaseyum安装ansible
yum install -y ansible

3、Ansible的配置文件:

/etc/ansible/

ansible.cfg:ansible的主配置文件,一般无需修改

hosts:主机组,声明可以被控制的主机

roles:公共角色目录

4、 配置远程主机清单

修改hosts文件:

vim hosts

配置主机有两种方式:1、直接声明主机的IP地址 2、主机名(要在/etc/hosts中做映射)

主机上生成密钥对并且传给被控制主机:

ssh-keygen -t rsa

配置密钥对验证

ssh-keygen -t rsa #一路回车,使用免密登录

sshpass -p '123' ssh-copy-id root@20.0.0.22

sshpass -p '123' ssh-copy-id root@20.0.0.23

若发送密钥对不成功,先到目标主机上执行一个命令,然后再传

ansible 20.0.0.23 -m command -a 'date'

ansible 20.0.0.22 -m command -a 'date'

三、ansible的模块(重要)

1、ansible的命令格式:

ansible 组名/IP地址 -m 模块名称 -a '参数列表(执行的命令)'ansible 20.0.0.23 -m shell -a 'touch /opt/123 && echo 123 > /opt/123 && cat /opt/123'
&& 逻辑且,前一个命令成功才会执行下一个命令ansible 20.0.0.23 -m shell -a 'touch /opt/456 ; ehco 456 > /opt/456 ; cat /opt/456'
;分号表示逻辑或,前面不管成功与否,后面的命令都会执行

ansible不适用交互式的命令

2、模块1:command模块

在远程主机执行Linux命令,不支持管道符,重定向输出

指定IP地址:

ansible 20.0.0.23 -m command -a 'date'
ansible 20.0.0.22 -m command -a 'date'

指定组,组内所有的声明主机都会执行:

ansible webserver -m command -a 'date'
ansible dbservers -m command -a 'date'

所有声明的主机全都执行:

ansible all -m command -a 'date'

不加-m,不声明使用的模块,默认就是command模块:

ansible 20.0.0.23  -a 'date'

command的一些常用参数:

chdir:在远程主机上运行命令,提前进入目录

先进home目录,然后再执行命令

ansible all -m command -a 'chdir=/opt ls'

creates:判断指定文件是否存在,若存在,不执行后续的操作

ansible all -m command -a 'creates=/opt/123 ls/opt'

removes:ansible all -m command -a 'chdir=/opt ls'

ansible 20.0.0.22 -m command -a 'removes=/opt/123 ls/opt'

3、模块二:shell模块

在远程主机上执行命令,相当于远程主机

ansible 20.0.0.22 -m shell -a 'useradd test'#创建用户test
ansible 20.0.0.22 -m shell -a 'echo 123456 | passwd --stdin test'#给test用户创建密码

举个例子:将IP地址切片出来:

ansible 20.0.0.22 -m shell -a "echo $(ifconfig ens33 | awk  'NR==2{print $2}')"

在ansible当中,多个引号之间要做隔离

创建脚本,再写入内容,最后执行

举个例子:写一个脚本

ansible 20.0.0.22 -m shell -a 'echo -e "#/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'

4、模块3:cron模块

远程给主机设置定时任务

两种状态: present表示添加(默认就是添加,可以省略)

absent:表示移除。在ansible中absent都可以表示移除的意思(删除)

* * * * * 分时日月周

分=minute

时=hour

日=day

月=month

周=weekday

job:任务计划需要执行的命令或者脚本

name:任务计划的名称,可以不加

ansible 20.0.0.22 -m cron -a 'minute="*/5" job="ls /opt" name=test1'

举个例子:

写一个9月1号8点30分,执行ls /opt 任务名:test2

30 8 1 9 *

ansible 20.0.0.22 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'

查看定时任务:

ansible 20.0.0.22 -m command -a 'crontab -l'

删除定时任务:

ansible 20.0.0.22 -m cron -a 'name=test1 state=absent'

删除未命名的定时任务(所有的None都会删除):

多个定时任务,如果不给名字都是None,一旦删除None,全部删除,不推荐(最好是指定一个不重复的名称)

ansible 20.0.0.22 -m cron -a 'name=None state=absent'

5、模块4:USER模块

用户管理模块

常用的参数:

name 指定用户名,必须要有

state present:创建用户,可以不加,默认

absent :删除一定要加absent

system=yes|no。标记用户使用是一个程序用户

uid:用户的唯一标识

group:指定用户的所在组

create_home=yes|no:替换用户的家目录,不替换可以不写,可省略

password:给用户创建密码

comment:添加用户的注释信息,可有可无

remove=yes|no,当删除用户时,加上remove=yes,删除用户的家目录,相当于userdel -r。如果不需要删除用户家目录,可省略这一项

ansible 20.0.0.22 -m user -a 'name=koeda system=yes '

在创建用户时,虽然我声明了是一个程序用户,但是默认的登录shell如果没有额外的声明,还是默认的/bin/bash,UID会按照程序用户来指定

创建程序用户:

ansible 20.0.0.22 -m user -a 'name=koeda1 system=yes shell=/sbin/nologin'

使用ansible的USER模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash

如果创建程序用户,一定要声明system=yes,声明shell的类型 shell=/sbin/nologin

也可以指定uid的方式,给用户分配一个uid

创建用户,选择uid,创建密码,指定家目录:

ansible 20.0.0.22 -m user -a 'name=koeda3 uid=1010 password=123456 home=/opt/test1'

更改用户家目录:

ansible 20.0.0.22 -m user -a 'name=koeda3 home=/home/koeda3 create_home=yes'

删除用户及其家目录:

ansible 20.0.0.22 -m user -a 'name=koeda remove=yes state=absent'

6、模块5:group模块(了解)

用户组的管理模块

gid 设置组的id

name必须要有

创建用户组:

ansible 20.0.0.22 -m group -a 'name=test1 gid=306 system=yes'

创建用户时添加到指定的组:

ansible 20.0.0.22 -m user -a 'name=test uid=1011 group=test1 '

删除用户组:

ansible 20.0.0.22 -m group -a 'name=test1 state=absent'

7、模块6:ping模块

ansible all -m ping

能ping通的主机必须是声明的主机

只有在/etc/ansible/hosts文件中声明的主机,ansible的控制端才可以进行远程操作

8、模块7:hostname模块

更改被控制端的主机名:

ansible 20.0.0.22 -m hostname -a 'name=webservers'ansible 20.0.0.23 -m hostname -a 'name=dbservers'

9、模块8:COPY模块

用于复制指定的主机文件到远程主机的模块

常用的参数:

dest:指出要复制的文件在哪,必须使用绝对路径。如果源目标是目录,指目标也得是目录。如果目标的文件存在,会覆盖原有的内容

src:复制文件的源,最好使用绝对路径,源目标是目录,指目标也得是目录

owner:支出文件的所有者

group:指定文件的所在组

content:从主机复制指定的内容到目标主机,用content就不能使用src

mode:指定复制之后的文件的权限

ansible 20.0.0.22 -m copy -a 'src=/opt/123 dest=/opt/123.txt owner=test mode=655'

举个例子:将ky32.txt文件复制到22主机,所有者test程序用户,所在组test,文件的权限600

ansible 20.0.0.22 -m user -a 'name=test system=yes shell=/sbin/nologin'
#创建程序用户
ansible 20.0.0.22 -m group -a 'name=test gid=333 system=yes'
#创建用户组
ansible 20.0.0.22 -m copy -a 'src=/opt/ky32.txt dest=/opt/32.txt owner=guoqi group=guoqi mode=600'
#复制文件,并且给权限

复制目录:

复制目录时,要保证不是空目录,要有文件

ansible 20.0.0.22 -m copy -a 'src=/opt/test dest=/opt/test1/ mode=777'

指定输入一个内容:

相当于echo功能

echo一个hello world!到22主机的opt下

ansible 20.0.0.22 -m copy -a 'content="hello world!" dest=/opt/hello.txt'

10、模块9:file模块

文件模块跟目录没有关系

管理文件属性

相关参数:

owner、group、mode等

state=link:创建链接文件

state=touch:创建文件

state=directory 创建目录

state=absent:删除文件

修改文件的所有者和所在组

ansible 20.0.0.22 -m file -a 'owner=test group=test mode=777 path=/opt/demo.txt'

file模块创建文件

ansible 20.0.0.22 -m file -a 'path=/opt/ky32.txt state=touch'
#创建文件

file模块创建目录

ansible 20.0.0.22 -m file -a 'path=/opt/ky32 state=directory'

将本机的/etc/fatab文件复制到远程主机,再用这个文件创建一个连接文件:

ansible 20.0.0.23 -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak'
#先复制
ansible 20.0.0.23 -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
#在创建链接文件

基于file模式删除远程文件

ansible 20.0.0.23 -m file -a 'path=/opt/fstab.link state=absent'

11、模块10:yum模块

在远程主机上安装软件包

ansible 20.0.0.23 -m yum -a 'name=httpd'ansible 20.0.0.23 -m yum -a 'name=tree'

在目标主机上的操作都是后台运行,不影响其他用户的使用。在日志中能打印

卸载软件:

ansible 20.0.0.23 -m yum -a 'name=tree state=absent'

12、模块11:service/systemd模块

常用参数:

state=started|stopped|restarted 三种管理动作

enabled=true 表示是否设置开机自启,默认就是开机不自动启动

runlevel:配合enabled的,若设置开机自启,可以设置运行级别。在命令行可以设置,但是不生效,必须要在playbook中使用

ansible 20.0.0.52 -m service -a 'enabled=ture name=nginx state=restarted'

举个例子:nginx 安装nginx 设置为开机自动,设置访问页面this is nginx

ansible 20.0.0.52 -m yum -a 'name=epel-release'ansible 20.0.0.52 -m yum -a 'name=nginx'ansible 20.0.0.52 -m service -a 'enabled=true name=nginx state=restarted'ansible 20.0.0.52 -m shell -a 'echo this is nginx > /usr/share/nginx/html'

13、模块12:script模块

运行本地脚本,然后将结果输出到目标主机

先创建一个脚本

chmod  777 test.sh

运行脚本,将内容输出到远程主机上

ansible all -m script -a 'test.sh'

14、模块13:setup模块

主要作用就是查看目标主机的环境信息(facts),目标节点的系统信息

查看所有环境信息

ansible all -m setup

查看目标主机的IP信息

ansible all -m setup -a 'filter=*ipv4'

查看CPU信息:

ansible all -m setup -a 'filter=*memory*'
ansible_processor

查看内存信息:

ansible all -m setup -a 'filter=*memory*'
ansible_memory_mb

查看内核:

ansible all -m setup -a 'filter=*proc*'
ansible_processor

查看os系统:

ansible all -m setup -a 'filter=*os*'
ansible_os_family

查看硬盘信息:

ansible all -m setup -a 'filter=*dev*'
ansible_devices

四、管理主机清单

快速声明多个主机

vim /etc/ansible/hosts
20.0.0.6[1:3]
#声明主机范围。表示声明20.0.0.61-63主机

取消密钥队免密登录

ansible_host:声明连接时的IP地址

ansible_port:声明对方的连接端口。默认是ssh的默认端口

ansible_user:指定连接时使用对方主机的用户名。不指定表示主机执行ansible的用户即为使用目标主机的用户名

ansible_password:指定连接ssh时的密码。这里是目标主机的用户密码

ansible_become:提升用户权限。也可以改变用户的身份

例如:ansible_become root。需要声明用户的密码

ansible_become-password:指定切换用户的密码。基于免密钥登录实现。
 

1、主机变量

vim /etc/ansible/hosts
#声明主机变量

#指定ip,定义好ssh连接的端口,用户,密码。做到免密连接
20.0.0.2[5:6] ansible_port=22 ansible_user=root ansible_password=123

这里将25、26主机生面变量,27没有声明

vim /etc/ansible/ansible.cfg

取消ssh的秘钥对验证

#---71行取消注释---
host_key_checking = False

测试连通性:

ansible webservers -m ping

这里注意:

声明好的主机节点的端口必须是22,root用户的密码必须是123

2、组变量

声明组变量
[webservers:vars]        #表示为 webservers 组内所有主机定义变量
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22

声明所有的主机都是用相同的用户名密码和端口
[all:vars1]                            #表示为所有组内的所有主机定义变量
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22

3、组嵌套

[nginx]
20.0.0.20
20.0.0.21
20.0.0.22[apache]
20.0.0.3[0:3][webs:children]	#表示为 webs 主机组中包含了 nginx 组和 apache 组内的所有主机
nginx
apache

相关文章:

Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

目录 一、ansible概述 1、简介 2、Ansible主要功能: 3、Ansible的另一个特点:所有模块都是幂等性 4、Ansible的优点: 5、Ansible的四大组件: 二、ansible环境部署: 1、环境: 2、安装ansible&#…...

QT中网络编程之发送Http协议的Get和Post请求

文章目录 HTTP协议GET请求POST请求QT中对HTTP协议的处理1.QNetworkAccessManager2.QNetworkRequest3.QNetworkReply QT实现GET请求和POST请求Get请求步骤Post请求步骤 测试结果 使用QT的开发产品最终作为一个客户端来使用,很大的一个功能就是要和后端服务器进行交互…...

Java 并发编程 —— Fork/Join 框架的原理详解

目录 一. 前言 二. 并发和并行 2.1. 并发 2.2. 并行 2.3. 分治法 三. ForkJoin 并行处理框架的理论 3.1. ForkJoin 框架概述 3.2. ForkJoin 框架原理 3.3. 工作窃取算法 四. ForkJoin 并行处理框架的实现 4.1. ForkJoinPool 类 4.2. ForkJoinWorkerThread 类 4.3.…...

3-10岁孩子语文能力培养里程碑

文章目录 基础能力3岁4岁5岁6-7岁(1-2年级)8-9岁(3-4年级)10岁(5年级) 阅读推荐&父母执行3岁4-5岁6-7岁(1-2年级)8-9岁(3-4年级)10岁(5年级&a…...

Vue+ElementUi 基于Tree实现动态节点添加,节点自定义为输入框列

VueElementUi 基于Tree实现动态节点手动添加&#xff0c;节点自定义为输入框列 代码 <el-steps :active"active" finish-status"success" align-center><el-step title"test1"/><el-step title"test2"/><el-st…...

Web前端-JavaScript(js数组和函数)

文章目录 1.数组1.1 数组的概念1.2 创建数组1.3 获取数组中的元素1.4 数组中新增元素1.5 遍历数组 2.函数2.1 函数的概念2.2 函数的使用函数声明调用函数函数的封装 2.3 函数的参数函数参数语法函数形参和实参数量不匹配时 2.4 函数的返回值2.4.1 案例练习 2.5 arguments的使用…...

判断数据是否为整数--函数设计与实现

#定义函数&#xff1a;is_num(s),判断输入的数据是否整数。 #(1)判断是否是数字 def is_num(s):if s.isdigit(): #isdigit()是一个字符串方法&#xff0c;用于检查字符串是否只包含数字字符。如果字符串只包含数字字符&#xff0c;则返回True&#xff1b;否则返回Falsereturn T…...

netty源码:(29)ChannelInboundHandlerAdapter

它实现的方法都有一个ChannelHandlerContext参数&#xff0c;它的方法都是直接调用ChannelHandlerContext参数对应的方法&#xff0c;该方法会调用下一个handler对应的方法。 可以继承这个类&#xff0c;重写感兴趣的方法,比如channelRead. 这个类有个子类&#xff1a;SimpleC…...

Shell脚本应用(二)

一、条件测试操作 Shell环境根据命令执行后的返回状态值〈$?&#xff09;来判断是否执行成功&#xff0c;当返回值为О时表示成功.否则〈非О值)表示失败或异常。使用专门的测试工具---test命令&#xff0c;可以对特定条件进行测试&#xff0e;并根据返回值来判断条件是否成立…...

Kafka基本原理及使用

目录 基本概念 单机版 环境准备 基本命令使用 集群版 消息模型 成员组成 1. Topic&#xff08;主题&#xff09;&#xff1a; 2. Partition&#xff08;分区&#xff09;&#xff1a; 3. Producer&#xff08;生产者&#xff09;&#xff1a; 4. Consumer&#xff08;…...

使用Python爬取GooglePlay并从复杂的自定义数据结构中实现解析

文章目录 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》&#xff0c;对分布…...

前后端分离下的鸿鹄电子招投标系统:使用Spring Boot、Mybatis、Redis和Layui实现源码与立项流程

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…...

ChatGPT 有什么新奇的使用方式?

来看看 OpenAI 内部是如何使用 ChatGPT 的。 目前&#xff08;4月29日&#xff09;距离ChatGPT发布了已经半年&#xff0c;这期间大家基本上把能想到的ChatGPT的使用方法都研究遍了——从写作、写代码&#xff0c;到翻译、英语润色&#xff0c;再到角色扮演等等。 所以&#x…...

【计算机四级(网络工程师)笔记】操作系统概论

目录 一、OS的概念 1.1OS的定义 1.2OS的特征 1.2.1并发性 1.2.2共享性 1.2.3随机性 1.3研究OS的观点 1.3.1软件的观点 1.3.2资源管理器的观点 1.3.3进程的观点 1.3.4虚拟机的观点 1.3.5服务提供者的观点 二、OS的分类 2.1批处理操作系统 2.2分时操作系统 2.3实时操作系统 2.4嵌…...

LeetCode算法练习top100:(10)贪心算法

package top100.贪心算法;import java.util.ArrayList; import java.util.List;public class TOP {//121. 买卖股票的最佳时机public int maxProfit(int[] prices) {int res 0, min prices[0];for (int i 1; i < prices.length; i) {if (prices[i] < min) {min price…...

随记-探究 OpenApi 的加密方式

open api 主要参数如下 appKey 接口Key&#xff08;app id&#xff09;appSecret 接口密钥timeStamp 时间戳 毫秒nonceStr 随机字符串signature 加密字符串 客户端 使用 appSecret 按照一定规则将 appKey timeStamp nonceStr 进行加密&#xff0c;得到密文 signature将 appK…...

stm32学习总结:4、Proteus8+STM32CubeMX+MDK仿真串口收发

stm32学习总结&#xff1a;4、Proteus8STM32CubeMXMDK仿真串口收发 文章目录 stm32学习总结&#xff1a;4、Proteus8STM32CubeMXMDK仿真串口收发一、前言二、资料收集三、STM32CubeMX配置串口1、配置开启USART12、设置usart中断优先级3、配置外设独立生成.c和.h 四、MDK串口收发…...

配置paddleocr及paddlepaddle解决报错 GLIBCXX_3.4.30 FreeTypeFont

配置 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/StyleText/README_ch.md#style-text 环境配置 https://www.paddlepaddle.org.cn/ 根据自己的cuda版本选择paddlepaddle-gpu # 新建conda环境 # python version conda create -n paddle python3.8 # 安装p…...

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离&#xff0c;增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移&#xff0c;而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统&#xff0c;Docker为MySQL提供…...

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来&#xff0c;物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环&#xff0c;PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网&#xff0c;实现工厂设备数据采集”这一主题&#xff0c;探讨PLC物联网…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...