Ansible安装与入门

目录

Ansible

ansible任务执行模式

ansible执行流程

ansible命令执行过程(背会)

ansible的安装方式

ansible的程序结构(yum安装为例)

ansible的配置文件查找顺序(背会)

核心配置文件

ansible的配置文件

Ansible常用命令

ansible-doc命令

部署ansible管理集群

实验环境

实验步骤

        安装ansible

        核心配置文件

        添加主机清单

        ansible的主机清单

免密设置

ansible配置公私钥

        配置公私钥

        copy一份公私钥给web主机

主机连通性测试

命令测试是否正常

Ansible常用模块


Ansible

ansible任务执行模式
  • ansible系统由控制主机被管节点的操作方式可以分为两类,即adhoc和playbook

  • ad-hoc模式(点对点模式)

使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell

  • playbook模式(剧本模式)

剧本模式是Ansible的主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task(任务)集合完成一类功能,比如web服务的安装部署、数据库服务的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件

ansible执行流程
  • 简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回结果。

ansible命令执行过程(背会)
  • 加载自己的配置文件,默认为/etc/ansible/ansible.cfg;

  • 查找对应的主机配置文件,找到要执行的主机或者组;

  • 加载自己对应的模块文件,如command;

  • 通过ansible将模块或者命令生成对应的py文件(python脚本),并且将该文件传输到远程服务器;

  • 对应执行用户的家目录.ansible/tmp/xxx/xxx.py文件;

  • 给文件添加执行权限;

  • 执行并且返回结果;

  • 删除临时的py文件, sleep 0退出;

ansible的安装方式

使用yum安装

yum安装是我们比较熟悉的安装方式。我们需要先安装一个epel-release包,然后再安装ansible即可。

yum install epel-release -y
yum install ansible -y
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install ansible -y
ansible的程序结构(yum安装为例)
  • 配置文件目录:/etc/ansible/

  • 执行文件目录:/usr/bin/

  • Lib库依赖目录:/usr/lib/pyhtonX.X/site-packages/ansible/

  • Help文档目录:/usr/share/doc/ansible-X.X.X/

  • Man文档目录:/usr/share/man/man1/

ansible的配置文件查找顺序(背会)
  • ansible与我们其他的服务在这一点上又很大的不同,这里的配置文件查找是从多个地方找的,顺序如下:

1.检查环境变量 ANSIBLE_CONFIG 指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg);

2. ~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;

3./etc/ansible.cfg检查etc目录的配置文件。

核心配置文件

        可用文件里命令生成一个

[root@localhost ~]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg  hosts  roles
[root@localhost ansible]# vim ansible.cfg [root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg

[root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
[root@localhost ansible]# vim ansible.cfg 

ansible的配置文件
  • ansible的配置文件路径是/etc/ansible/ansible.cfg,ansible许多参数,下面我们列出一些常见的参数:

vim  /etc/ansible/ansible.cfg
inventory = /etc/ansible/hoste    #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible    #指向存放ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就行。fbrks = 5    #并发连接数,默认为5
sudo_user = root    #设置默认执行命令的用户 ,2.14版本中是:become_user=root
remote_port = 22    #指定连接被管理节点的端口,默认为22端口,为安全考虑,建议修改
host_key_checking = False    #设置是否检查SSH主机的密钥,值为True/False,关闭后第一次连接不会提示配置实例
timeout = 60    #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.cfg    #指定一个存储ansible日志的文件(默认不记录日志)
[defaults]
inventory = /etc/ansible/hosts #主机清单文件路径。Ansible 通过此文件定义目标主机/组。
library = /usr/share/ansible/modules #Ansible 内置模块的搜索路径。若需加载自定义模块,可添加路径
modules_dir = /usr/share/ansible/modules #与 library 类似,但仅用于查找模块
remote_user = root #远程主机的登录用户。默认以 root 身份登录目标主机(生产环境建议改为普通用户,配合 become 提权)。
ask_pass = False ## 是否提示输入登录密码。若 remote_user 非免密登录,设为 True 会交互式询问密码(不安全,推荐用 SSH 密钥免密)。
private_key_file = None ##SSH 私钥文件路径。用于免密登录(如 private_key_file = ~/.ssh/id_rsa)。
remote_port = 22 ## 远程 SSH 端口。若目标主机 SSH 非默认端口(如 2222),需修改此值(remote_port = 2222)。
timeout=10  #SSH 连接超时时间(秒)。网络不稳定时可调大(如 timeout = 30)。
log_path=None #Ansible 操作日志路径。设为 /var/log/ansible.log 可记录详细执行日志(需确保文件可写)。
module_name = command #未指定模块时的默认模块。例如 ansible host -m shell 可省略 -m shell(不推荐,易混淆)。
executable=	/bin/sh #命令执行的 Shell 解释器。若目标主机默认 Shell 非 /bin/sh(如 /bin/bash),可修改(executable = /bin/bash)
prompt=	\# ##特权用户提示符匹配规则。用于判断是否已提权(如 prompt = \$ 可识别 $ 或 #)。
fact_caching=False #是否启用事实缓存(Facts Caching)。设为 True 可缓存主机信息(如 fact_caching = jsonfile,配合 fact_caching_connection 指定存储路径
fact_caching_timeout=86400 #事实缓存过期时间(秒)。默认 24 小时(86400 秒),可根据需求调整(如 fact_caching_timeout = 3600 缓存 1 小时)。
deprecation_warnings=True #是否显示已弃用警告。生产环境可设为 False 减少冗余输出(deprecation_warnings = False)。
display_skipped_hosts=True #是否显示跳过的主机。若任务因条件不满足跳过某些主机,设为 False 可隐藏这些主机的输出(display_skipped_hosts = False)。
host_key_checking=True #是否检查 SSH 主机密钥。首次连接新主机时会提示确认指纹,设为 False 可跳过(生产环境不建议,存在中间人攻击风险)。
inventory_ignore_extensions=['.pyc', '.pyo', '.swp', '.swo'] # 忽略的清单文件扩展名。避免误加载临时文件(如 inventory_ignore_extensions = ['.bak'])。
action_plugins=/usr/share/ansible/plugins/action # Action 插件搜索路径。自定义 Action 插件可添加至此(如 action_plugins = /opt/my_plugins/action)。
callback_plugins=/usr/share/ansible/plugins/callback #Callback 插件搜索路径。用于自定义输出格式(如集成 Jenkins、Slack 等)。
filter_plugins=/usr/share/ansible/plugins/filter # Filter 插件搜索路径。自定义变量过滤逻辑(如 filter_plugins = /opt/my_plugins/filter)
test_plugins= /usr/share/ansible/plugins/test # Test 插件搜索路径。用于测试变量或文件(如 test_plugins = /opt/my_plugins/test)
vars_plugins = /usr/sha
Ansible常用命令
[root@localhost ansible]# ls /usr/bin/| grep ansible
ansible
ansible-community
ansible-config
ansible-connection
ansible-console
ansible-doc
ansible-galaxy
ansible-inventory
ansible-playbook
ansible-pull
ansible-vault
#### ansible命令集解释*   /usr/bin/ansible,Ansible AD-Hoc临时命令执行工具,常用于临时命令的执行
*   /usr/bin/ansible-doc,Ansible模块功能查看工具(document)
*   /usr/bin/ansible-galaxy,下载上传优秀的代码或者Roles模块的官网平台,基于网络的
*   /usr/bin/ansible-playbook,Ansible定制自动化的任务集编排工具
*   /usr/bin/ansible-pull,Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维架构能力要求高)
*   /usr/bin/ansible-vault,Ansible文件加密工具
*   /usr/bin/ansible-console,Ansible基于Linux Consoble界面可与用户交互的命令执行工具
ansible-doc命令

ansible-doc命令常用于获取模板块信息及其适用帮助,一般用法如下:

ansible-doc -l    ##获取全部模块信息
ansible-doc -s MOD_NAME    #获取指定模块的使用帮助

部署ansible管理集群

全程是只需要,在ansible上面操作就行!!!

实验环境
主机名IP地址安装包
ansible192.168.158.164epel-release、ansible
node1192.168.158.159-
node2192.168.158.160-
实验步骤
        安装ansible
[root@localhost ~]# hostnamectl set-hostname ansible
[root@localhost ~]# su
[root@ansible ~]# yum install epel-release -y
[root@ansible ~]# yum install ansible -y
        核心配置文件

        可用文件里命令生成一个

[root@localhost ~]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg  hosts  roles
[root@localhost ansible]# vim ansible.cfg [root@localhost ansible]# ansible-config init --disabled -t all > ansible.cfg
        添加主机清单
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg  hosts  roles
[root@ansible ansible]# vi hosts [web]        ##添加到最后一行
192.168.158.159
192.168.158.160
        ansible的主机清单
  • 在配置文件中,我们提到了资源清单,这个清单就是主机清单,里面保存的是一些ansible需要连接管理的主机列表。

  • 如下是ansible主机清单的定义方式:

  • vim /etc/ansible/hosts

(直接在末尾添加)

例如:

1.直接指明主机地址或者主机名:
#green.example.com#
#bule.example.com#
# 192.168.115.101
# 192.168.115.1022.定义一个主机组(组名)把地址或者主机名加进去
[mysql_test]
192.168.115.101
192.168.115.102
192.168.115.103
  • 需要注意的是,这里的组成员可以使用通配符来匹配,这样对于一些标准化管理就比较方便。我们可以根据实际情况来配置我们的主机列表,具体的操作如下:

vi /etc/ansible/hosts  #定义一组web主机组[web]
192.168.158.159
192.168.158.160

免密设置

ansible配置公私钥
        配置公私钥
        copy一份公私钥给web主机
[root@localhost ansible]# ssh-keygen -N '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/fwy5SFyKfwKf61esKQk57v7ok2gruFMyf1tncudYKA root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|                 |
|                 |
|         .       |
|        S.= o.   |
|   . o . B+*+oo  |
|    = o E +***.. |
|   + o . *o+B=o. |
|    +.. ooOO*=+  |
+----[SHA256]-----+
[root@localhost ansible]# ssh-copy-id 192.168.158.159
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.158.159 (192.168.158.159)' can't be established.
ED25519 key fingerprint is SHA256:T18Ri2Kqfht/W/As6DBvSPOqvDBUhgWq5aORE9E4CPQ.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.158.159's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.158.159'"
and check to make sure that only the key(s) you wanted were added.[root@localhost ansible]# ssh-copy-id 192.168.158.160
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.158.160 (192.168.158.160)' can't be established.
ED25519 key fingerprint is SHA256:T18Ri2Kqfht/W/As6DBvSPOqvDBUhgWq5aORE9E4CPQ.
This host key is known by the following other names/addresses:~/.ssh/known_hosts:1: 192.168.158.159
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.158.160's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.158.160'"
and check to make sure that only the key(s) you wanted were added.
主机连通性测试
命令测试是否正常
[root@localhost ansible]# ansible 192.168.158.159 -m ping 
192.168.158.159 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"
}
[root@localhost ansible]# ansible 192.168.158.160 -m ping 
192.168.158.160 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"
}

Ansible常用模块

    • ​**command & shell:​**​ (执行命令)
      • 作用:​​ 让你的“小机器人”在被管服务器上运行命令。就像你打开服务器的命令行窗口输入指令一样。
      • 区别:​
        • command:只运行简单命令,不支持管道符(|)、重定向(> <)、环境变量($HOME)这些复杂操作。
        • shell:可以运行任何你在命令行能运行的复杂命令,支持管道、重定向、变量。 ​注意:​​ 能用 command 就用 command,更安全、结果更稳定;实在需要复杂操作再用 shell
    • ​**copy & fetch:​​ (文件传输) - ​方向相反!​**​
      • ​**copy:​​ 作用是把你本地的文件或者Playbook目录下的文件**,​复制到被管服务器上。就像你让管家把你电脑里的文件A拿到服务器B上去放好。
      • ​**fetch:​​ 作用是从被管服务器上把文件拉取(下载)到你运行Playbook的电脑**​(控制节点)。就像你让管家去服务器B上把某个重要的日志文件C拿回来给你看。
    • ​**file:​**​ (文件/目录管理)
      • 作用:​​ 操作文件和目录本身(不是内容)。让管家去创建文件、目录、设置权限(读、写、执行)、更改所有者、创建软链接/硬链接等。比如:在服务器上创建目录 /data,权限设为 755,所有者是 www-data
    • ​**fetch:​**​ (上面已介绍)
    • ​**cron:​**​ (定时任务)
      • 作用:​​ 让管家在服务器上设置(添加、修改、删除)定时任务(cron job)​。就像配置“服务器上的闹钟”,让它定期执行某个命令或脚本(比如每天凌晨备份数据库)。
    • ​**yum (CentOS/RHEL) / apt (Ubuntu/Debian):​​ (软件包管理) - ​图片是 yum,注意你的系统!​**​
      • 作用:​​ 让管家在服务器上安装、更新、卸载、查看软件包。就像用手机上的“应用商店”装/卸载APP一样。
    • ​**service:​**​ (服务管理)
      • 作用:​​ 让管家启动、停止、重启、重新加载、查看系统服务的状态。比如启动Nginx网站服务(nginx)、停止MySQL数据库服务(mysqld)。
    • ​**user & group:​**​ (用户/组管理)
      • 作用:​
        • user:让管家创建、修改、删除用户账号,设置密码、家目录、Shell、所属组等。
        • group:让管家创建、修改、删除用户组,管理组成员。
    • ​**script:​**​ (运行脚本)
      • 作用:​​ 让管家把你写在本地的Shell脚本、Python脚本等复制到被管服务器上去执行。比如你写了一个 backup.sh 的备份脚本,用这个模块传到服务器上并运行它。
    • ​**setup (或 gather_facts):​**​ (收集信息)
      • 作用:​​ Ansible管家在执行任何任务前,会自动收集被管服务器的各种信息(主机名、IP地址、操作系统版本、内存大小、磁盘空间等)。你可以在任务中直接使用这些信息(称为 facts),实现更智能的自动化(比如根据内存大小设置不同的软件参数)。这个模块就是负责收集这些信息的,默认会自动运行。

        

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

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

相关文章

【Spring】Spring Boot启动过程源码解析

目录 一、启动入口 二、SpringApplication的构造过程 2.1 设置应用类型 2.2 设置初始化器&#xff08;Initializer&#xff09; 2.2.1 获取BootstrapRegistryInitializer对象 2.2.2 获取ApplicationContextInitializer对象 2.3 设置监听器&#xff08;Listener&#xff…

CDN架构全景图

CDN架构全景图 CDN&#xff08;内容分发网络&#xff09;是一种通过在全球范围内部署边缘节点服务器&#xff0c;将内容缓存至离用户最近的位置&#xff0c;从而加速内容分发、降低延迟并减轻源站压力的分布式网络架构。其核心设计目标是优化互联网内容传输效率&#xff0c;提升…

【pytest高阶】源码的走读方法及插件hook

一、pytest源码走读方法 依赖库认知篇 &#x1f4e6;这是理解 pytest 源码的 “前菜”&#xff0c;先认识 3 个超重要的小伙伴&#xff1a;iniconfig &#x1f4c4;&#xff1a;像个 “文件小管家”&#xff0c;专门负责读取 ini 配置文件&#xff08;比如 pytest 的配置&#…

算法训练营day32 动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

今天开始动态规划的部分&#xff01; 其实说白了&#xff0c;动态规划我感觉就是找类似递归的规律&#xff0c; 动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规…

基于神经网络的手写数字识别系统

基于神经网络的手写数字识别系统 结合模板匹配和神经网络两种方法进行手写数字识别。这个系统包括图像预处理、特征提取、神经网络训练和可视化分析。 %% 基于神经网络的手写数字识别系统%% 清理工作区 clear; clc; close all;%% 加载手写数字数据集 % 使用MATLAB自带的手写数字…

机器学习?一文看懂这门热门技术

&#x1f31f; 什么是机器学习&#xff1f;一文看懂这门热门技术在人工智能&#xff08;AI&#xff09;的大潮中&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09; 无疑是最耀眼的明星之一。它让计算机具备了 “自我学习” 的能力&#xff0c;让自动驾驶、智能…

Spring的初始化钩子

1. PostConstruct JSR-250 标准注解&#xff08;不是 Spring 独有&#xff09;&#xff0c;用来标记 Bean 初始化完成后要执行的方法。会在 Bean 的构造方法执行完、依赖注入完成后执行。 使用实例&#xff1a; Component public class Demo {PostConstructpublic void init() …

【AI】Java生态对接大语言模型:主流框架深度解析

文章目录1. Deep Java Library (DJL)2. LangChain4j&#xff08;LLM&#xff09;3. HuggingFace Inference API4. OpenAI Java Client技术对比矩阵架构设计建议在人工智能浪潮下&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为技术核心。Java生态通过以下框架实现高效…

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

文章目录1 单个 .cs文件2 创建 多个 .cs文件2.1 添加Hero类2.1 添加ShowInfo类2.3 关于命名空间的引用2.4 所有.cs文件代码3 test3项目文件下载1 单个 .cs文件 上一讲中 描述游戏中英雄的角色 所有代码在一个.cs文件中&#xff0c; 如果代码很多&#xff0c;类很多&#xff0…

【MySQL基础篇】:MySQL常用数据类型的选择逻辑与正确使用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;MySQL篇–CSDN博客 文章目录数据类型1.数据类型分类2.数值类型int整形类型bit位类型float小…

三、搭建springCloudAlibaba2021.1版本分布式微服务-springcloud loadbalancer负载均衡

什么是负责均衡 Spring Cloud LoadBalancer是一个客户端负载均衡器&#xff0c;类似于Ribbon&#xff0c;但是由于Ribbon已经进入维护模式&#xff0c;并且Ribbon 2并不与Ribbon 1相互兼容&#xff0c;所以Spring Cloud全家桶在Spring Cloud Commons项目中&#xff0c;添加了Sp…

Oracle不完全恢复实战指南:从原理到操作详解

核心提示&#xff1a;当误删表、日志损坏或控制文件丢失时&#xff0c;Oracle的不完全恢复是DBA最后的救命稻草。掌握关键恢复技术&#xff0c;可在数据灾难中力挽狂澜。一、不完全恢复核心概念 1. 核心特点 必须关闭数据库&#xff1a;在MOUNT状态下执行重做日志恢复权限要求&…

Linux之shell脚本篇(二)

一、shell编程之if语句引言Linux在shell编程中&#xff0c;通常都是以自上而下运行&#xff0c;但是为了提高其代码严谨性&#xff0c;我们即引入了多条件 控制语句例如&#xff1a;if、for、while、case等语句&#xff0c;有时候针对条件我们还会结合正则表达式去运用。将这些…

如何在android framewrok dump camera data

实现dump 函数 实现1 void dumpBufferToFile(buffer_handle_t* buffer, int width, int height, int frameNum) {void* data NULL;GraphicBufferMapper::getInstance().lock(*buffer, GRALLOC_USAGE_SW_READ_OFTEN, Rect(width, height), &data);char filename[128];sprin…

机器学习中的可解释性:深入理解SHAP值及其应用

机器学习可解释性的重要性在人工智能技术快速发展的2025年&#xff0c;机器学习模型已经深度渗透到医疗诊断、金融风控、司法量刑等关键领域。然而&#xff0c;随着模型复杂度的不断提升&#xff0c;一个根本性矛盾日益凸显&#xff1a;模型预测性能的提升往往以牺牲可解释性为…

.NET9 使用 OData 协议项目实战

.NET 中 ODate 协议介绍 OData(Open Data Protocol) 是一个开放的 Web 协议&#xff0c;用于查询和更新数据。在 .NET 生态系统中&#xff0c;OData 被广泛支持和使用。 主要特性 1. 统一的数据访问方式 提供标准化的查询语法支持 CRUD 操作支持元数据描述 2. 查询能力 标…

Android 性能优化:提升应用启动速度(GC抑制)

前言 在移动应用开发领域&#xff0c;启动速度是用户体验的重要指标。对于Android应用而言&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制虽然是内存管理的核心&#xff0c;但在应用启动期间频繁触发GC会显著拖慢启动速度。本文将深入探讨如何通过GC…

做了一款小而美的本地校验器

需求说明 前阵子收到一则读者留言&#xff0c;指出&#xff1a;市面上AI核稿工具&#xff08;ProWritingAid&#xff0c;WPS AI Spell Check&#xff0c;Writer&#xff0c;QuillBot&#xff0c;Grammarly&#xff09;要么收费太高&#xff0c;要么让人担心文章泄露。 如下图所…

uniapp + uview-plus 微信小程序二维码生成和保存完整解决方案

uniapp + uview-plus 微信小程序二维码生成和保存完整解决方案 📋 项目背景 在开发微信小程序时,经常需要实现二维码的生成和保存功能。本文档提供了一个基于 uniapp + uview-plus 框架的完整解决方案,彻底解决了以下常见问题: ✅ Canvas API 兼容性问题 ✅ 微信小程序权…

Linux中应用程序的安装于管理

Linux中应用程序的安装于管理 一 . rpm安装 1.挂载 光驱里面存放了很多rpm的软件包 光驱在系统中使用时&#xff0c;需要挂载 mount /dev/cdrom /mnt/ cd /mnt[rootstw mnt]# ls CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7 EFI images Packag…