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

运维自动化之ANSIBLE

一、Ansible的发展史及功能

官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/

1、Ansible功能

2、Ansible特性

  • 批量执行远程命令,可以对远程的多台主机同时进行命令的执行

  • 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务

  • 编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构

  • 提供自动化运维工具的开发API, 有很多运维工具,如jumpserver(堡垒机)就是基于 ansible 实现自动化管理功能

  • 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块(账号,软件等)

  • Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块

  • 基于Python语言实现

  • 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)

  • 安全,基于OpenSSH

  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对

  • 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构 剧本演员要按照 系统按照你规定的方式去执行命令

  • 较强大的多层解决方案 role

3、Ansible架构

1.Ansible组成

  • INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts 需要管理的服务清单

  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义

  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用

  • API:供第三方程序调用的应用程序编程接口

2.Ansible命令执行来源

  • USER 普通用户,即SYSTEM ADMINISTRATOR

  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件

  • CMDB(配置管理数据库) API 调用

  • PUBLIC/PRIVATE CLOUD API调用

二、Ansible安装和入门

1、安装

yum install epel-release.noarch  -y   ###安装额外源
yum install ansible -y                ###yum安装ansible
yum info  ansible                     ###查看详细信息

2、查看基本信息

[root@localhost ~]#ansible --version

3、相关文件

[root@localhost ~]#rpm -qc ansible    ###查看ansible的安装文件
/etc/ansible/ansible.cfg              ###ansible的主配置文件
/etc/ansible/hosts                    ###ansible的hosts文件

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件

  • /etc/ansible/hosts 主机清单

  • /etc/ansible/roles/ 存放角色的目录

4、ansible主配置文件

Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下

ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效./ansible.cfg   #当前目录下的ansible.cfg~/.ansible.cfg #当前用户家目录下的.ansible.cfg/etc/ansible/ansible.cfg  #系统默认配置文件[root@node1 yum.repos.d]#ansible --version

Ansible 的默认配置文件 /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   					#默认并发数
#sudo_user     = root 					#默认sudo 用户
#ask_sudo_pass = True 					#每次执行ansible命令是否询问ssh密码
#ask_pass     = True   
#remote_port   = 22
#host_key_checking = False     			#检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log 			#日志文件,建议启用
#module_name = command   		、mod		#默认模块,可以修改为shell模块
[privilege_escalation] 					#普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

5、inventory 主机清单文件

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织

官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

默认的inventory file 位置在:

/etcansible/hosts

参数详解:

ansible_ssh_host 
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port 
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222ansible_ssh_user 
#默认的 ssh 用户名ansible_ssh_pass 
#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)ansible_sudo_pass 
#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适用于1.8及以上版本)ansible_connection 
#与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.ansible_ssh_private_key_file
#ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.ansible_shell_type 
#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为'csh' 或 'fish'.ansible_python_interpreter 
#目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

例如:

[web]                        
192.168.10.101:666
#可以指定ssh端口非默认的端口
192.168.10.102[server]
192.168.10.[100:105]
#指定连续的主机[RS35]
node[1:5]  
#指定连续的主机[server:RS35]
server
RS35
#可以嵌套组[local]
192.168.10.100 ansible_connection=local
#指定本地连接,无需ssh配置#ansible_connection=ssh 需要StrictHostKeyChecking no
192.168.10.103  ansible_connection=ssh  ansible_ssh_port=2222  ansible_ssh_user=root ansible_ssh_password=123123
10.0.0.6  ansible_connection=ssh  ansible_ssh_user=root ansible_ssh_password=123123
还可以指定用户身份  端口号 和密码#执行ansible命令时显示别名,如web01
[websrvs]
node2 ansible_ssh_host=192.168.10.101
node3 ansible_ssh_host=192.168.10.102[websrvs]
ansible_ssh_password=123123

举例:

[root@node1 ansible]#vim hosts 
[local]
192.168.10.100 ansible_connection=local[web]
192.168.10.101
192.168.10.102[accp]
192.168.10.103
192.168.10.104[webserver]
192.168.10.[101:103]
192.168.10.105[web:children]
web
accp
[root@localhost ~]#vim /etc/ansible/hosts
[web]
192.168.10.101
192.168.10.102[root@localhost ~]#ansible web  -m ping      ##指定 之前清单中的主机组   需要输入 yes 或no,但是只有一次机会,只能
#可以指定   m代表使用模块  ping代表ping模块 命令探测下,需要输入 yes 或no
##输入yes后[root@localhost ~]#ansible web  -m ping -k   ##-k 输入密码 只有一次机会,如果密码不同无法一起管理,建议ssh免密

ansible 默认使用 ssh 连接
所以管理前要免密登录[root@localhost ~]#vim /etc/ssh/ssh_config 
#   修改35行 StrictHostKeyChecking  no[root@localhost ~]#vim /etc/ansible/ansible.cfg 
#   71 host_key_checking = False
开启71行的ansible的不验证即可

①修改ssh_confing 

 如果使用第二种方式,将前面的ask改回来

②  修改 ansible 主配置文件  /etc/ansible/ansible.cfg 

[root@localhost ~]#ansible web  -m ping -k   ##-k 输入密码 只有一次机会,如果密码不同无法一起管理,建议ssh免密

[root@localhost ~]#ansible web --list
hosts (2):192.168.10.101192.168.10.102[root@localhost ~]#ansible kysw --list
hosts (2):192.168.10.103192.168.10.104[root@localhost ~]#ansible all --list
hosts (4):192.168.10.101192.168.10.102192.168.10.103192.168.10.104

6、Ansible相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具

  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字

  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本

  • /usr/bin/ansible-pull 远程执行命令的工具

  • /usr/bin/ansible-vault 文件加密工具

  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具

  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

ansible有很多相关工具,非常重要有三千多模块

###    ansible-doc -l   可以列出所有模块

[root@localhost ~]#ansible-doc -l
fortios_router_community_list                                 Configure community lists in Fortinet's FortiOS a...
azure_rm_devtestlab_info                                      Get Azure DevTest Lab facts                      
ecs_taskdefinition                                            register a task definition in ecs                
avi_alertscriptconfig                                         Module for setup of AlertScriptConfig Avi RESTful...
tower_receive                                                 Receive assets from Ansible Tower                
netapp_e_iscsi_target                                         NetApp E-Series manage iSCSI target configuration
azure_rm_acs                                                  Manage an Azure Container Service(ACS) instance  
fortios_log_syslogd2_filter                                   Filters for remote system server in Fortinet's Fo...
junos_rpc                                                     Runs an arbitrary RPC over NetConf on an Juniper ...
na_elementsw_vlan                                             NetApp Element Software Manage VLAN              
pn_ospf                                                       CLI command to add/remove ospf protocol to a vRou...
pn_snmp_vacm                                                  CLI command to create/modify/delete snmp-vacm    
cp_mgmt_service_sctp                                          Manages service-sctp objects on Check Point over ...
onyx_ospf                                                     Manage OSPF protocol on Mellanox ONYX network dev...
icx_command                                                   Run arbitrary commands on remote Ruckus ICX 7000 ...
cs_snapshot_policy                                            Manages volume snapshot policies on Apache CloudS...
nxos_install_os                                               Set boot options like boot, kickstart image and i...
cnos_static_route                                             Manage static IP routes on Lenovo CNOS network de...
win_eventlog                                                  Manage Windows event logs                        
vmware_category                                               Manage VMware categories                         
vmware_host_feature_info                                      Gathers info about an ESXi host's feature capabil...
avi_cluster                                                   Module for setup of Cluster Avi RESTful Object   
na_ontap_user                                                 NetApp ONTAP user configuration and management   
aci_l3out                                                     Manage Layer 3 Outside (L3Out) objects (l3ext:Out...
memset_server_info                                            Retrieve server information                      
gcp_compute_subnetwork_info                                   Gather info for GCP Subnetwork                   
azure_rm_virtualmachinescalesetextension                      Manage Azure Virtual Machine Scale Set (VMSS) ext...
fortios_report_dataset                                        Report dataset configuration in Fortinet's FortiO...
avi_api_session                                               Avi API Module

如果那个模块不清楚,直接可以  ansible-doc  模块名称

例如:

[root@localhost ~]#ansible-doc --help     ###ansible-doc  模块帮助

[root@localhost ~]#ansible-doc -s ping          ###例如查看ping的简单用法
###  -s  查看简单用法

1.ansible

执行临时任务一次性任务

用法:

ansible <host-pattern> [-m module_name] [-a args]
命令     主机或者清单中的组 -m 指定模块      -a  执行的任务

选项:

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

-v       #详细过程 -vv -vvv更详细

[root@localhost ~]#ansible web -a "touch /data/kysw" -vansible web -a "touch /data/kysw" -vv

幂等性:一个命令执行一次和执行一百次,结果是一样的

相关文章:

运维自动化之ANSIBLE

一、Ansible的发展史及功能 官网&#xff1a;https://www.ansible.com/ 官方文档&#xff1a;https://docs.ansible.com/ 1、Ansible功能 2、Ansible特性 批量执行远程命令,可以对远程的多台主机同时进行命令的执行 批量安装和配置软件服务&#xff0c;可以对远程的多台主机…...

算法训练day42leetcode01背包问题 416. 分割等和子集

01 背包 题目描述 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 题目分析 每一件物品其实只有两个状态&#xff0c;取或者不取&…...

VulnHub - DarkHole

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog DarkHole 靶机下载地址&#xff1a;DarkHole: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xf…...

前端学习笔记 | WebAPIs(DOM+BOM)

一、作用和分类 1、基本概念 作用&#xff1a;使用JS去操作HTML和浏览器 分类&#xff1a;DOM&#xff08;文档对象模型&#xff09;和BOM&#xff08;浏览器对象模型&#xff09; html的标签JS的DOM对象 2、获取DOM对象-参数必须加引号 &#xff08;1&#xff09;选择匹配的第…...

简易内存池(100%用例)C卷(JavaPythonC++Node.jsC语言)

请实现一个简易内存池 , 根据请求命令完成内存分配和释放。 内存池支持两种操作命令,REQUEST和RELEASE,其格式为: REQUEST=请求的内存大小 表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为 0 ,则输出error。 RELEASE=释放的…...

【算法与数据结构】队列的实现详解

文章目录 &#x1f4dd;队列的概念及结构&#x1f320; 队列的顺序实现&#x1f309;初始化&#x1f320;入队&#x1f309;出队&#x1f320;获取队列首元素&#x1f309;获取队列尾部元素&#x1f320;获取队列中有效元素个数&#x1f309; 队列是否为空&#x1f320;查看队列…...

GPT-3后的下一步:大型语言模型的未来方向

摘要&#xff1a; 本文将概述GPT-3后的下一步&#xff1a;大型语言模型的未来方向&#xff0c;包括技术发展趋势、应用场景、挑战与机遇。 引言&#xff1a; GPT-3是OpenAI于2020年发布的一款大型语言模型&#xff0c;它在自然语言处理领域取得了突破性进展。GPT-3的出现标志…...

基于机器学习的曲面拟合方法

随着科技的不断发展&#xff0c;机器学习成为了最近最热门的技术之一&#xff0c;也被广泛应用于各个领域。其中&#xff0c;基于机器学习的曲面拟合方法也备受研究者们的关注。曲面拟合是三维模型处理中的重要技术&#xff0c;其目的是用一组数据点拟合出平滑的曲面&#xff0…...

【C++从练气到飞升】03---构造函数和析构函数

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、类的6个默认成员函数 二、构造函数 1. 构造函数的概念 2. 构造函数的定义 3. 构造函数的特性 三、析构函…...

mybatis转义字符

编写SQL中会用到<,>,<,> 等&#xff0c;但是在mybatis中不可以这么写&#xff0c;与xml文件的元素<>冲突&#xff0c;所以需要转义。整理转义字符如下&#xff1a; 符号原始字符转义字符大于>>大于等于>>小于<<小于等于<<和&&a…...

vue3 实现一个tab切换组件

一. 效果图 二. 代码 文件 WqTab.vue: <template><div ref"wqTabs" class"wq-tab"><template v-for"tab in tabs" :key"tab"><div class"tab-item" :class"{ ac: tabActive tab.key }" c…...

JSONObject在Android Main方法中无法实例化问题

目录 前言一、Main(非安卓环境)方法下运行二、安卓坏境下运行三、why? 前言 原生的json,即org.json.JSONObject; 在Android Studio中的Main方法里运行报错&#xff0c;但在安卓程序运行过程正常 一、Main(非安卓环境)方法下运行 static void test() {try {// 创建一个 JSON …...

京津冀协同发展:北京·光子1号金融算力中心——智能科技新高地

京津冀协同发展是党中央在新的历史条件下提出的一项重大国家战略&#xff0c;对于全面推进“五位一体”总体布局&#xff0c;以中国式现代化全面推进强国建设、民族复兴伟业&#xff0c;具有重大现实意义和深远历史意义。随着京津冀协同发展战略的深入推进&#xff0c;区域一体…...

aspnetcore使用jwt时一直提示401 authorization

测试aspnetcore使用Jwt做认证授权的时候&#xff0c;一直提示401 Authorization 最后发现问题所在&#xff0c;希望能有所帮助 1.检查注册了认证和授权中间件 缺一不可 /*认证*/app.UseAuthentication();/*授权*/app.UseAuthorization();2.检查swagger的配置项 builder.Servic…...

三款文案自动生成器,帮你轻松生成原创文案

文案在今天已经成为了许多企业和个人推广产品和服务的重要手段。然而&#xff0c;对于很多人来说&#xff0c;写作文案并非易事。有时候&#xff0c;我们可能会遇到文案灵感枯竭的情况&#xff0c;或者花费大量时间在寻找合适的词句上。但是&#xff0c;别担心&#xff01;现在…...

多线程并发模拟实现与分析:基于Scapy的TCP SYN洪水攻击实验研究

简介 实现基于Python实现的多线程TCP SYN洪水攻击。该实例利用Scapy库构造并发送TCP SYN数据包&#xff0c;通过多线程技术模拟并发的网络攻击行为。 实现原理 SYN Flood攻击是一种经典的分布式拒绝服务&#xff08;DDoS&#xff09;攻击方式&#xff0c;利用了TCP协议握手过…...

git命令行提交——github

1. 克隆仓库至本地 git clone 右键paste&#xff08;github仓库地址&#xff09; cd 仓库路径&#xff08;进入到仓库内部准备提交文件等操作&#xff09; 2. 查看main分支 git branch&#xff08;列出本地仓库中的所有分支&#xff09; 3. 创建新分支&#xff08;可省…...

LM2903BIDR比较器芯片中文资料规格书PDF数据手册参数引脚图功能封装尺寸图

产品概述&#xff1a; M393B 和 LM2903B 器件是业界通用 LM393 和 LM2903 比较器系列的下一代版本。下一代 B 版本比较器具有更低的失调电压、更高的电源电压能力、更低的电源电流、更低的输入偏置电流和更低的传播延迟&#xff0c;并通过专用 ESD 钳位提高了 2kV ESD 性能和输…...

遍历list过程中调用remove方法

1、普通for循环遍历List删除指定元素&#xff0c;list.remove(index) List<String> nameList new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六")); nameList.add("张七"); nameList.add("…...

Java解决罗马数字转整数

Java解决罗马数字转整数 01 题目 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 …...

从魔方到算法:用Python一步步实现Kociemba二阶段算法(附完整代码)

从魔方到算法&#xff1a;用Python实现Kociemba二阶段求解器 魔方作为经典的智力玩具&#xff0c;其求解算法一直是计算机科学和数学交叉领域的研究热点。本文将带你从零开始&#xff0c;用Python实现经典的Kociemba二阶段算法&#xff0c;不仅理解其数学原理&#xff0c;更能获…...

OpenClaw技能开发入门:为Qwen3-32B-Chat镜像编写自定义自动化模块

OpenClaw技能开发入门&#xff1a;为Qwen3-32B-Chat镜像编写自定义自动化模块 1. 为什么需要自定义OpenClaw技能&#xff1f; 去年我接手了一个重复性极高的数据整理工作——每天要从十几个不同格式的Excel文件中提取特定字段&#xff0c;合并成统一报表。当我第三次在凌晨两…...

综合能源系统双层鲁棒优化,考虑风光负荷电价四重不确定性的综合能源系统双层鲁棒优化模型,采用多目标粒子群算法(MOPSO)求解,同时进行鲁棒度和置信水平的敏感度分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

[英雄联盟辅助工具] League-Toolkit:提升游戏体验与决策效率的全方位解决方案

[英雄联盟辅助工具] League-Toolkit&#xff1a;提升游戏体验与决策效率的全方位解决方案 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 一、…...

嵌入式串口通信效率优化实战

1. 串口通信效率优化背景在嵌入式系统开发中&#xff0c;串口通信是最基础也最常用的外设接口之一。我从事嵌入式开发十多年来&#xff0c;处理过各种串口通信场景&#xff0c;从简单的调试信息输出到复杂的工业控制协议传输。传统串口通信方式在简单场景下工作良好&#xff0c…...

NTC热敏电阻温度解算:轻量级Beta模型C++库

1. 项目概述Thermistor 是一个轻量级 C 库&#xff0c;专为嵌入式系统中 NTC&#xff08;负温度系数&#xff09;热敏电阻的温度解算而设计。其核心目标并非提供通用传感器抽象层&#xff0c;而是以最小资源开销、最高计算确定性&#xff0c;完成从原始 ADC 采样值到物理温度值…...

【数据结构与算法】第30篇:哈希表(Hash Table)

一、什么是哈希表1.1 基本思想哈希表通过哈希函数将关键字映射到数组的某个位置&#xff0c;实现快速访问。textkey → 哈希函数 → 数组下标 → 访问/存储示例&#xff1a;hash(key) key % 10key25 → 25%105 → 存入下标5key37 → 37%107 → 存入下标71.2 哈希冲突不同的key…...

crypto-js —— 前端数据安全的 JavaScript 加密利器

1. 为什么前端开发需要数据加密&#xff1f; 想象一下这样的场景&#xff1a;你在网上填写了一份包含个人信息的表单&#xff0c;点击提交后&#xff0c;这些数据会以明文形式在网络中传输。如果有人在传输过程中截获了这些数据&#xff0c;你的隐私就会完全暴露。这就是为什么…...

Yii2的$app->handleRequest($request)的本质的庖丁解牛

$app->handleRequest($request) 是 Yii2 框架运行时心脏的每一次搏动。 如果说 new Application() 是**“创世”&#xff08;构建世界&#xff09;&#xff0c;那么 $app->handleRequest($request) 就是“演化”&#xff08;处理事件&#xff09;。 它是整个 MVC 流程的总…...

ThinkPHP3.x核心特性全解析

好的&#xff0c;我们来梳理一下 ThinkPHP 3.x 版本的主要特性&#xff1a;MVC 架构支持&#xff1a;严格遵循模型(Model)-视图(View)-控制器(Controller)的设计模式。清晰分离业务逻辑、数据操作和页面展示&#xff0c;便于协作开发和维护。路由支持&#xff1a;支持多种 URL …...