Ansible 基本使用

Ansible 清单

静态主机清单

主机清单支持多种格式,例如ini、yaml、脚本等。

本次课程使用 ini 格式。

 #创建主机清单[lyk@controller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4​#测试连接单个服务器[lyk@controller ~ 14:08:18]$ ansible node1  -i ./inventory -m command -a id​#对所有服务器执行命令[lyk@controller ~ 13:42:33]# ansible all -i inventory -a idnode4 | CHANGED | rc=0 >>uid=0(root) gid=0(root) 组=0(root)node2 | CHANGED | rc=0 >>uid=0(root) gid=0(root) 组=0(root)node3 | CHANGED | rc=0 >>uid=0(root) gid=0(root) 组=0(root)node1 | CHANGED | rc=0 >>uid=0(root) gid=0(root) 组=0(root)controller | CHANGED | rc=0 >>uid=0(root) gid=0(root) 组=0(root)​-作用:给 "通讯录" 里所有服务器发命令,让它们报告自己的身份-结果解读:每台服务器回复了自己的用户 ID(这里都是 root)​#只对特定服务器 node1 执行命令[lyk@controller ~ 13:43:30]# ansible node1 -i inventory -a idnode1 | CHANGED | rc=0 >>uid=0(root) gid=0(root) 组=0(root)​#执行黄色,表示安装软件包[lyk@controller ~ 13:52:23]$ ansible all -i ./inventory -m yum -a 'name=vsftpd state=present' -b#再次执行变绿,表示已下载过[lyk@controller ~ 13:52:23]$ ansible all -i ./inventory -m yum -a 'name=vsftpd state=present' -b​#卸载软件包,absent[lyk@controller ~ 13:58:12]$ ansible all -i ./inventory -m yum -a 'name=vsftpd state=absent' -b​#其他四台执行也能看到[lyk@controller ~ 14:04:11]$ yum list vsftpd​#查看主机列表[lyk@controller ~ 14:08:18]$ ansible -i ./inventory --list-host all​​[lyk@controller ~ 14:08:05]$ ansible -i ./inventory --list-host node3​

分组管理服务器

 #创建服务器分组[lyk@controller ~ 14:10:08]$ vim inventory#vim添加[controllers]controller[nodes]node1node2node3node4​[lyk@controller ~ 14:11:34]$ ansible -i ./inventory --list-hosts controllershosts (1):controller[lyk@controller ~ 14:12:00]$ ansible -i ./inventory --list-hosts nodeshosts (4):node1node2node3node4​​​[lyk@controller ~ 14:12:09]$ vim inventory#vim添加=====================================================================[controllers]controller​[nodes]node1node2node3node4​[nj]node1node2​[bj]node3node4​[webs]node1node2​[dbs]node3node4=====================================================================#查看不同分组[lyk@controller ~ 14:14:29]$ ansible -i ./inventory --list-hosts njhosts (2):node1node2[lyk@controller ~ 14:14:45]$ ansible -i ./inventory --list-hosts bjhosts (2):node3node4[lyk@controller ~ 14:14:50]$ ansible -i ./inventory --list-hosts webshosts (2):node1node2[lyk@controller ~ 14:14:54]$ ansible -i ./inventory --list-hosts dbshosts (2):node3node4​​​#vim**在[controllers]上添加的,算其他10.1.8.234​[controllers]#查看其他分组[lyk@controller ~ 14:21:47]$ ansible -i ./inventory --list-hosts ungroupedhosts (1):10.1.8.234​​​#创建组嵌套(部门包含子部门)。vim 主机组嵌套 nj和bj都放在dc组,就可以显示所有主机了[dc:children]njbj​[lyk@controller ~ 14:21:16]$ ansible -i ./inventory --list-hosts dchosts (4):node1node2node3node4​​#重新编辑vim[lyk@controller ~ 14:27:09]$ vim inventory app1.example.com​[webservers]web1.example.comweb2.example.com192.168.3.7​[dbservers]db1.example.comdb2.example.com192.0.2.42​[eastdc]web1.example.comdb1.example.com​[westdc]web2.example.comdb2.example.com​[dc:children]eastdcwestdc​#图形化展示服务器结构[lyk@controller ~ 14:28:48]$ ansible-inventory -i inventory --graph@all:|--@dbservers:|  |--192.0.2.42|  |--db1.example.com|  |--db2.example.com|--@dc:|  |--@eastdc:|  |  |--db1.example.com|  |  |--web1.example.com|  |--@westdc:|  |  |--db2.example.com|  |  |--web2.example.com|--@ungrouped:|  |--app1.example.com|--@webservers:|  |--192.168.3.7|  |--web1.example.com|  |--web2.example.com​​​

管理 ANSIBLE 配置文件

配置文件位置和优先级

  • 优先级排序

  1. 环境变量 ANSIBLE_CONFIG

  2. ./ansible.cfg,当前位置中的 ansible.cfg,当前位置一般是项目目录。

  3. ~/.ansible.cfg

  4. /etc/ansible/ansible.cfg

 #初始状态:ansible --version[lyk@controller web 14:58:11]$ ansible --versionansible 2.9.27config file = /etc/ansible/ansible.cfg​#创建用户家目录配置文件:touch ~/.ansible.cfg[lyk@controller web 14:59:48]$ touch ~/.ansible.cfg[lyk@controller web 15:00:16]$ ansible --version |grep 'config file'config file = /home/lyk/.ansible.cfg​#在当前工作目录创建配置文件:touch ansible.cfg[lyk@controller web 15:02:52]$ touch ansible.cfg[lyk@controller web 15:03:03]$ ansible --version |grep 'config file'config file = /home/lyk/web/ansible.cfg​#通过环境变量指定配置文件:export ANSIBLE_CONFIG=/opt/ansible.cfg[lyk@controller web 15:03:06]$ export ANSIBLE_CONFIG=/opt/ansible.cfg[lyk@controller web 15:03:53]$ sudo touch /opt/ansible.cfg[lyk@controller web 15:03:58]$ ansible --version |grep 'config file'config file = /opt/ansible.cfg​-变化:这是最高优先级!不管其他地方有没有配置,Ansible 都只用你指定的这个。就像你明确说 "我就要用工具箱里的那把剪刀",其他地方的都不算数

 总结:Ansible 配置文件的优先级(从高到低)就像 “寻找东西的优先级”:​环境变量ANSIBLE_CONFIG指定的路径(最优先,手动指定的 “目标位置”)当前工作目录的ansible.cfg(次之,“手边的文件”)用户家目录的~/.ansible.cfg(再次之,“个人抽屉里的文件”)系统级的/etc/ansible/ansible.cfg(默认,“公共仓库的文件”)[]

指定 "主机名单"——Ansible 该管理哪些机器?

  • 核心目标:Ansible 需要一个 "主机清单"(inventory)来知道要管理哪些机器,就像老师需要花名册才知道要叫哪些学生

 #配置 inventory 路径:vim ansible.cfg[lyk@controller web 15:14:54]$ vim ansible.cfg #web的ansible.cfg[defaults]inventory = ./inventory     # 告诉Ansible:主机清单在当前目录的inventory文件里​[lyk@controller ~ 15:10:22]$ mv inventory web/ # 把主机清单移到web目录[lyk@controller ~ 15:12:19]$ cd web[lyk@controller web 15:16:31]$ cat ansible.cfg [defaults]inventory = ./inventory​#只能在web下查看, 验证主机清单:ansible all --list-hosts[lyk@controller web 15:16:46]$ ansible all --list-hostshosts (7):app1.example.comweb1.example.comweb2.example.com192.168.3.7db1.example.comdb2.example.com192.0.2.42​

修改 inventory 内容 —— 自定义要管理的主机

 [lyk@controller web 15:25:18]$ vim inventory   # 编辑主机清单[controllers]controller​[node]node[1:4]​[lyk@controller web 15:25:34]$ vim ansible.cfg [defaults]inventory = ./inventory​[lyk@controller web 15:26:10]$ ansible all -a id​[lyk@controller web 15:26:56]$ ansible all -a id -b​

SSH 登录设置 ——Ansible 如何连接到主机?

 #密钥移走,使免密登录失效[lyk@controller web 15:27:56]$ mv /home/lyk/.ssh/id_rsa /home/lyk/.ssh/id_rsa.bak#没有密钥,需要输密码了[lyk@controller web 15:32:10]$ ssh node1 hostnamelyk@node1's password: ​#不给登录,连接失败**ansible**默认不主动要密码[lyk@controller web 15:32:40]$ ansible node1 -a hostnamenode1 | UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true​​# 允许密码登录:vim ansible.cfg添加ask_pass = True,开启密码验证[lyk@controller web 15:39:10]$ vim ansible.cfg #添加可输入密码登录[defaults]inventory = ./inventoryask_pass = True     # 告诉Ansible:连接时主动要SSH密码​#允许密码登录[lyk@controller web 15:37:46]$ ansible node1 -a hostnameSSH password: ​
 #移动回来恢复密钥登录[lyk@controller web 15:40:09]$ mv /home/lyk/.ssh/id_rsa.bak /home/lyk/.ssh/id_rsa#把允许密码登录注释掉[lyk@controller web 15:39:43]$ vim ansible.cfg [defaults]inventory = ./inventory#ask_pass = True            **ask_pass = True  # 注释后,Ansible不再主动要密码**​#验证:直接登录回来不用密码[lyk@controller web 15:40:34]$ ssh node1 hostnamenode1.lyk.cloud#验证[lyk@controller web 15:42:14]$ ansible node1 -a hostnamenode1 | CHANGED | rc=0 >>node1.lyk.cloud

提权配置 —— 让 Ansible 有安装软件的权限

 #没有提权安装不了[lyk@controller web 15:51:08]$ ansible node1 -m yum -a 'name=httpd state=present'​[lyk@controller web 15:58:07]$ vim ansible.cfg #vim配置自动提权:vim ansible.cfg添加[privilege_escalation][privilege_escalation]become=True#become_method=sudo#become_user=root#become_ask_pass=False #提权不需密码但是注释掉依然能免密#已经设置过了[lyk@controller web 16:00:38]$ sudo vim /etc/sudoers.d/lyk#   lyk ALL=(ALL) NOPASSWD:ALL#无需密码​​#安装成功[lyk@controller web 16:00:38]$ ansible node1 -m yum -a 'name=httpd state=present'​
 总结:这些命令的核心逻辑配置文件优先级:控制 Ansible 用哪个规则干活,项目中常用当前目录的ansible.cfg。inventory:告诉 Ansible 要管理哪些主机,按组划分更方便。SSH 登录:默认用密钥免密,密钥失效时开ask_pass输密码。提权:通过become=True让 Ansible 临时获取 root 权限,才能执行高权限操作。

ansible-config

ansible-config view

  • 查看当前ansible配合文件内容

 #问 Ansible 现在用的是哪个配置文件[lyk@controller web 16:14:17]$ ansible --version|grep fileconfig file = /home/lyk/web/ansible.cfg#查看当前生效的配置文件的实际内容[lyk@controller web 16:18:54]$ ansible-config view[defaults]inventory = ./inventory#ask_pass = Trueremote_user = lyk#module_name = command[privilege_escalation]become=Truebecome_method=sudobecome_user=rootbecome_ask_pass=False​

ansible-config dump

  • 显示所有生效的配置,包括默认值和自定义设置

 [lyk@controller web 16:20:04]$ ansible-config dump

ansible-config list

  • 列出所有可用的配置参数及其说明

 #提供帮助文档[lyk@controller web 16:21:28]$ ansible-config list

localhost 连接

  • Ansible会隐式设置localhost,并使用local连接类型连接localhost

 #列出当前配置中 "all" 组包含的所有主机[lyk@controller web 16:21:28]$ ansible all --list-hostshosts (5):controllernode1node2node3node4​#查看localhost这台主机的信息[lyk@controller web 16:23:47]$ ansible --list-hosts localhosthosts (1):localhost​

AD HOC 命令

命令作用

  • 快速执行单个Ansible任务,而不需要将它保存下来供以后再次运行。它们是简单的在线操作,无需编写playbook即可运行。

  • 快速测试和更改很有用。例如,您可以使用临时命令确保一组服务器上的/ etc/hosts文件中存在某一特定的行。您可以使用另一个临时命令在许多不同的计算机上高效重启一项服务,或者确保特定的软件包为最新版本。

Ansible 部分模块

  • 文件模块

    • copy: 将控制主机上的文件复制到受管节点,类似于scp

    • file: 设置文件的权限和其他属性

    • lineinfile: 确保特定行是否在文件中

    • synchronize: 使用 rsync 将控制主机上的文件同步到受管节点

  • 软件包模块

    • package: 自动检测操作系统软件包管理器

    • yum: 使用 YUM 软件包管理器管理软件包

    • apt: 使用 APT 软件包管理器管理软件包

    • gem: 管理 Rubygem

    • pip: 从 PyPI 管理 Python 软件包

  • 系统模块

    • ansible.posix.firewalld : 使用firewalld管理任意端口和服务

    • reboot: 重新启动计算机

    • service: 管理服务

    • user、group: 管理用户和组帐户

  • NetTools模块

    • get_url: 通过HTTP、HTTPS或FTP下载文件

    • nmcli: 管理网络

    • uri: 与 Web 服务交互

环境准备

1. ansible.cfg配置(操作说明书)
 [lyk@controller ~ 17:02:40]$ cd web[lyk@controller web 17:02:43]$ cat ansible.cfg =================================================================[defaults]inventory = ./inventory # 指定“地址簿”位置:当前目录的inventory文件#ask_pass = True        # 注释掉了,意思是不自动询问SSH密码(因为已经配置免密)remote_user = lyk       # 默认用lyk用户登录受管节点#module_name = command   # 注释掉了,默认模块不指定为command​[privilege_escalation]become=True             # 自动切换到特权用户(类似sudo)become_method=sudo      # 用sudo方式切换become_user=root        # 切换到root用户become_ask_pass=False   # 切换时不询问密码(前提是lyk用户sudo免密)=================================================================​
 -作用:这是 Ansible 的 “默认规则”,告诉它:​去哪里找要管理的主机(inventory = ./inventory);用什么用户登录(remote_user = lyk);要不要自动获取 root 权限(become=True,相当于每次命令都带sudo)。
2. inventory配置(地址簿)
 [lyk@controller web 17:03:05]$ cat inventory =================================================================[controllers]   # 分组:控制节点组controller      # 组内主机:controller​[node]          # 分组:节点组node[1:4]       # 组内主机:node1、node2、node3、node4(用通配符简写)=================================================================

3.ansible-doc:模块的 “使用手册查询工具”
 # 查看模块清单及说明[lyk@controller ~ 17:06:36]$ ansible-doc -l​# 查看模块清单及位置[lyk@controller ~ 17:06:55]$ ansible-doc -F​# 查看特定模块说明文档[lyk@controller ~ 17:07:31]$ ansible-doc user
4.command模块:“基础命令执行器”(最常用,但功能有限)
  • command 模块允许管理员在受管节点的命令行中运行任意命令。要运行的命令通过-a选项指定为该模块的参数

  • command模块是 Ansible 里最基础的 “命令运行工具”,直接在受管节点执行命令,但有个限制:不经过 shell 解释器,所以不支持 shell 的 “高级功能”(如环境变量、管道|、重定向>等)

 # 在node1上执行hostname命令(查看主机名)[lyk@controller web 17:10:13]$ ansible node1 -m command -a 'hostname'node1 | CHANGED | rc=0 >>node1.lyk.cloud​## 加-o选项:精简输出(一行显示结果,适合批量查看)[lyk@controller web 17:10:16]$ ansible node1 -m command -a 'hostname' -onode1 | CHANGED | rc=0 | (stdout) node1.lyk.cloud
 参数解析:​ansible node1:对 “地址簿” 中的 node1 主机操作;-m command:使用 command 模块;-a 'hostname':模块参数是要执行的命令(这里是hostname);-o:精简输出格式。
5.shell 模块“带 shell 解释器的命令执行器”(支持更多功能)
  • shell模块和command类似,但它会通过受管节点的/bin/sh(shell 解释器)执行命令,所以支持所有 shell 特性(如环境变量、管道、重定向、shell 内置命令等)

 # 用command模块执行set命令(失败)[lyk@controller web 17:11:21]$ ansible node1 -m command -a setnode1 | FAILED | rc=2 >>[Errno 2] 没有那个文件或目录​## 用shell模块执行set命令(成功)[lyk@controller web 17:12:05]$  ansible node1 -m shell -a set

注意:command和shell模块要求被管理主机安装Python。

核心区别
 command:“直接跑命令,不找 shell 帮忙”,适合简单命令(如hostname、ls);shell:“让 shell 帮忙跑命令”,适合需要 shell 特性的场景(如echo $PATH、ls | grep txt)

6.raw 模块“万能但粗糙的命令执行器”(不依赖 Python)
  • raw 模块,可以直接在远端主机shell中执行命令,远端主机不需要安装Python(特别是针对网络设备)。在大部分场景中,不推荐使用command、shell、raw模块执行命令,因为这些模块不具有幂等性

  • raw模块是个 “特例”:它直接在受管节点执行命令,不需要受管节点安装 Python(这是和command/shell最大的区别)

 # 用raw模块在node1的/tmp目录写一个hello.txt文件[lyk@controller web 17:12:05]$ ansible node1 -m raw -a 'echo "hello ansible" > /tmp/hello.txt'node1 | CHANGED | rc=0 >>Shared connection to node1 closed.​# 用command模块验证文件内容(此时已安装Python,所以能执行)[lyk@controller web 17:13:27]$ ansible node1 -a 'cat /tmp/hello.txt'node1 | CHANGED | rc=0 >>hello ansible​# 用shell模块也能实现同样的写入(但依赖Python)[lyk@controller web 17:13:42]$ ansible node1 -m shell -a 'echo "hello ansible" > /tmp/hello.txt'node1 | CHANGED | rc=0 >>
核心区别
 -依赖 Python?command/shell需要,raw不需要(适合网络设备、新系统等没装 Python 的场景);-幂等性?三者都差(幂等性:重复执行结果一致),比如echo "a" > file每次执行都会覆盖文件,而专用模块(如copy)会检查是否需要修改,更安全;-用法:raw是 “万不得已才用”,比如初始化系统时装 Python 前。

总结:三个模块的 “选择指南”

模块是否依赖 Python支持 shell 特性(管道 / 变量等)适用场景缺点
command简单命令(如hostnamels不支持 shell 高级功能
shell需要 shell 特性的命令(如set、`lsgrep`)依赖 Python
raw是(通过系统默认 shell)无 Python 的设备(如网络设备)、初始化

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

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

相关文章

网络资源模板--基于Android Studio 实现的九寨沟App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情(部分) 首页 购票页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也…

系统架构设计师备考之架构设计实践知识

1.信息系统架构设计理论与实践1.1.基本概念信息系统架构定义目前关于信息系统架构较为权威的定义有: (1)信息系统架构是系统的结构,由软件元素、元素外部可见属性和元素间关系组成。 (2)信息系统架构是软件…

【IgH EtherCAT】如何利用 RTAI 提供的实时任务和调度机制来构建一个高精度、确定性的工业控制应用

SVG图展示了系统的分层架构:RTAI实时层:包含RT_TASK、信号量和定时器EtherCAT Master层:主站、域、从站配置和PDO映射EtherCAT网络层:与实际硬件设备(EL3162模拟输入、EL2004数字输出)通信关键特点&#xf…

7款热门智能电视文件管理器横向评测

7款智能电视文件管理器横向评测 在智能电视和电视盒子日益普及的今天,一款好用的文件管理器能让您的数字生活更加便捷。本文为您评测了7款广受欢迎的TV版文件管理器,助您找到最适合自己的工具。 1. ES文件浏览器TV版 ES文件浏览器是一款广受欢迎的多功能…

Python 类元编程(导入时和运行时比较)

导入时和运行时比较 为了正确地做元编程,你必须知道 Python 解释器什么时候计算各个代码 块。Python 程序员会区分“导入时”和“运行时”,不过这两个术语没有严 格的定义,而且二者之间存在着灰色地带。在导入时,解释器会从上到 下…

[git diff] 对比检查变更 | 提交前复审 | 版本回退

git diff git diff 是 Git 版本控制系统中用于比较文件差异的核心命令,可以显示工作目录、暂存区(Index)和仓库历史之间的变化。 通过对比不同版本或状态的文件内容,帮助开发者理解代码变更。 比较工作目录与暂存区 运行以下命令查…

【数据可视化-85】海底捞门店数据分析与可视化:Python + pyecharts打造炫酷暗黑主题大屏

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

物联网之小白调试网关设备

小伙伴们,你们好呀!我是老寇!跟我一起学习调试网关设备 相信搞过物联网的朋友,对网关设备非常熟悉,本人以小白的视角,手把手教你调试网关设备! 工作中使用的是Ubuntu操作系统,因此&a…

Node.js特训专栏-实战进阶:22. Docker容器化部署

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 专栏内容规划详情 我将从Docker容器化部署的基础概念入手,介绍Node.js应用容器化的步骤,包括创建Dockerfile、构建镜像、运行…

eclipse嵌入式编译速度慢

eclipse 嵌入式 编译 速度慢 同一个项目,eclipse编译速度越来越慢,一开始几秒钟编译完,后面要10分钟。只需要将以下两个程序卸载重新安装即可。

编译Android版本可用的高版本iproute2

背景: Android自带的iproute2 太老,很多指令格式不支持 直接基于Android源码,替换源码下iproute2 代码编译新版,报错太多,于是改用Android NDK工具编译 环境: android-ndk-r25c-linux.zip 下载链接&am…

JavaScript的fetch函数的用法

基本语法fetch函数用于发起网络请求,返回一个Promise对象。基本语法如下:fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > console.error(Error:, error));GET请求发起一个简单的GET请求&…

Json和XML文件相互转化

目录 一.XML转Json文件 示例:将XML转换为JSON 依赖准备 Java代码示例 代码详细讲解 二.Json转XML文件 示例:将JSON转换为XML 依赖准备 Java代码示例 代码详细讲解 关键代码解析 将JSON转换为XML 写入文件 示例输入与输出 三.具有相同功能的…

Python科学计算与可视化领域工具TVTK、Mayavi、Mlab、Traits(附视频教程)

概述 TVTK、Mayavi、Mlab 和 Traits 都是 Python 科学计算与可视化领域中紧密相关的工具,它们常被结合使用来处理和展示三维数据。视频教程:https://pan.quark.cn/s/f73e875225ca 1. TVTK TVTK(Traits-based Visualization Toolkit&#xff0…

SQL INSERT INTO SELECT 详解

SQL INSERT INTO SELECT 详解 引言 SQL(Structured Query Language)是数据库操作的基础语言,广泛用于各种关系型数据库管理系统中。在SQL中,INSERT INTO SELECT 是一个强大的功能,它允许用户从一个表中选取数据,并直接将这些数据插入到另一个表中。本文将详细讲解 SQL …

python速成学习路线

第一部分:核心基础(语法与工具) 目标:掌握 Python 的基本语法规则、数据处理方式和开发工具 核心内容: 环境搭建 安装Python 3.x版本(推荐3.10)配置开发工具(如PyCharm、VS Code或…

自然语言处理的实际应用

在这个信息爆炸的时代,我们每天都在与文字、语音打交道 —— 发送消息、查询信息、使用智能助手…… 这些看似平常的互动背后,都离不开一项关键技术的支撑:自然语言处理(NLP)。作为人工智能的重要分支,NLP …

Docker实战:为项目打造即开即用的宝塔LNMP环境

Docker实战:为项目打造即开即用的宝塔LNMP环境背景一、准备基础镜像二、启动配置容器(关键步骤)三、容器内环境配置(逐步执行)1. 基础环境搭建2. 安装Systemd(宝塔依赖)3. 安装宝塔面板&#xf…

.net\c#web、小程序、安卓开发之基于asp.net家用汽车销售管理系统的设计与实现

.net\c#web、小程序、安卓开发之基于asp.net家用汽车销售管理系统的设计与实现

药房智能盘库系统:基于CV与时间序列预测的库存革命

> 在医疗资源日益紧张的今天,**全国78%的药房仍依赖人工盘库**,平均每100家药房每年因库存问题损失超50万元。当计算机视觉遇见时间序列预测,一场药房库存管理的智能化革命正在悄然发生。 --- ### 一、传统药房库存的三大痛点与破局思路 #### 致命痛点分析 1. **人工…