红帽Redhat--Ansible实战1
在运行Windows操作系统的主机LAPTOP-OUR52V78上安装有VMware Workstation Player软件。因为Windows自带的虚拟机平台软件"Hyper-V"使用难度较大,而且关于在"Hyper-V"上运行虚拟机,修改虚拟机错误的相关技术博客和文章的数量稀少,不利于顺利进行Ansible实战,所以使用"VMware Workstation Player"软件,并通过"VMware Workstation Player"软件,创建用来进行Ansible实战的虚拟机。同时只需要采用VMware Workstation Player来进行Ansible实战,不需要使用VMware Workstation,因为VMware Workstation过于丰富的界面设置选项会将本应用于Ansible实战的注意力转移到虚拟机管理上去,而虚拟机管理是红帽RHCSA(红帽认证系统管理员)认证的主要内容,并不是将Ansible作为主要考察内容的RHCE(红帽认证工程师)认证的主要内容,所以为了集中注意力,屏蔽掉虚拟机管理的细节,只使用VMware Workstation Player来进行Ansible实战的做法是合理的。另外,"VMware Workstation"软件的版本是17,而不是16,也是为了避免软件版本对Ansible实战产生可能的Bug,进而影响Ansible实战的进度。
因为Ansible是一款开源的软件,所以我们能够通过软件包管理工具,免费下载到ansible软件。同时Ansible是一款自动化运维工具,在传统的运维工作中,假如一位运维人员负责生产环境下的20台服务器,那么对于这一个运维人员来说,一台接一台的在生产环境的20台服务器上,进行相同的日志查看、网卡管理、软件更新、用户管理等工作就成为无法避免的事情,也是影响运维效率的一大因素。而Ansible自动化运维工具的使用,使得下面的场景成为可能:在生产环境中,新引入1台服务器,一共21台服务器。其中新引入的1台服务器作为控制节点,安装Ansible软件包,控制其余的20台服务器。原有的20台服务器作为被管理节点,不需要安装Ansible软件包,仍照常执行生产任务。所以Ansible是一款开源的自动化运维工具。
Ansible的底层是Python和SSH这两款同时被在安装Linux系统时自动安装的软件。因为Ansible基于Python和SSH软件,作为控制节点的服务器通过使用Ansible软件对作为被管理节点的服务器发出的所有命令,最终都会转化为经由SSH传输并且在作为被管理节点的主机上执行的Python代码,而生产环境中的服务器在被安装Linux系统时就已经自动安装了Python和SSH。所以在上面的例子中,作为被管理节点的服务器不需要安装Ansible软件包,只有作为控制节点的主机才需要安装Ansible软件包。
基于Ansible的特性,为了进行Ansible实战,"VMware Workstation Player"上至少需要三台虚拟机,因为如果只有两台虚拟机,那么将不利于学习在作为控制节点的主机上进行作为被控制节点的服务器的分组。因为Ansible软件对于支持它运行的操作系统的要求是,CentOS8和RHEL9这两款Linux发行版的优于CentOS7这款Linux发行版,而我们仅需要一台虚拟机,让它作为控制节点的主机,并且RHEL9这款Linux发行版只有在红帽官网上注册账号后才能下载到,且来自中国区的下载请求会被红帽官方列入管控行为,所以CentOS8被选择作为运行Ansible软件的操作系统,安装在一台虚拟机上。另外的两台虚拟机可以选择安装曾经同样由红帽推出的CentOS7操作系统。值得注意的一点是,三台虚拟机的虚拟网络适配器应该连接在同一个虚拟网络上,即如果安装有CentOS8操作系统的作为控制节点的主机的虚拟网络适配器连接到了VMnet8这个默认采用NAT模式的虚拟网络上时,安装有CentOS7操作系统的作为被控制节点的主机的虚拟网络适配器也应该同时连接到VMnet8这个默认采用NAT模式的虚拟网络。当然考虑到作为控制节点的主机需要使用yum软件包管理工具进行ansible软件包的安装,使用默认采用NAT模式的VMnet8虚拟网络来连接三台虚拟机的做法是更合理的。
操作系统名称 | IP地址 | 角色 |
CentOS8 Stream | 192.168.133.148 | 控制节点 |
CentOS7 | 192.168.133.147 | 被控制节点 |
CentOS7 | 192.168.133.146 | 被控制节点 |
当在"VMware Workstation Player"上创建三台虚拟机并安装好对应的操作系统、配置好对应的虚拟网络适配器之后,我们需要对作为控制节点的主机进行Ansible软件的安装。虽然当初在安装有CentOS8 Stream操作系统的主机上作为root用户使用"yum install ansible"命令安装"ansible"时,并没有提前下载epel源,但是在文心一言关于“如何在Linux系统上安装Ansible软件”的回答中,在安装"ansible"之前应该先下载epel源被提到,我猜测,是因为CentOS8 Stream操作系统默认的软件源中已包含可供下载的"ansible"软件,所以在作为控制节点的安装有CentOS8 Stream操作系统的主机中,直接使用"yum install ansible"命令安装"ansible"软件是合理的。下图显示已被安装好的ansible软件:
[root@localhost ~]# rpm -qa | grep ansible
ansible-core-2.15.3-1.el8.x86_64
[root@localhost ~]#
"rpm -qa | grep ansible" ,"rpm -qa"命令表示列出已经安装在CentOS8 Stream操作系统中的所有rpm软件包,"-q"参数表示"query"查询,"-a"参数表示所有,"-qa"即表示查询所有软件包,"grep ansible"表示在列出的已经安装在CentOS8 Stream操作系统中的所有rpm软件包中,过滤出包含有"ansible"的软件包。"ansible-core-2.15.3-1.el8.x86_64"即表示ansible软件包已经被安装在作为控制节点的主机中。
[root@localhost ~]# ansible --version
ansible [core 2.15.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.11/site-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.11.4 (main, Aug 11 2023, 13:46:19) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20)] (/usr/bin/python3.11)
jinja version = 3.1.2
libyaml = True
[root@localhost ~]#
运行"ansible --version"命令,当出现图中所示的包含"ansible"的版本信息在内的"ansible"软件配置信息时,即表示"ansible"已被正确下载并安装在作为管理节点的主机中。
在作为控制节点的主机成功安装Ansible软件之后,作为一般用户user,需要创建一个文件夹专门用于存放Ansible相关文件,可以通过"mkdir ~/ansible"命令,在当前用户user的家目录下,创建名为"ansible"的文件夹。在该文件夹下有两个基本的配置文件,一个是"inventory"文件,作用是列出作为被管理节点的所有主机;另一个是"ansible.cfg"文件,作用是确定被使用的inventory文件、确定作为管理节点的主机在通过SSH连接到作为被管理节点的服务器上时使用被管理节点服务器上的哪个用户来执行Python命令、确定管理节点主机在通过SSH连接到被管理节点服务器上时需不需要提示输入SSH连接的密码、确定在被管理节点服务器上是否需要提权到另一个用户、确定在被管理节点服务器上提权到另一个用户的方法、确定在被管理节点服务器上提权到哪个用户、确定在被管理节点服务器上进行提权操作时是否需要提示输入密码。在作为管理节点的服务器上的"inventory"和"ansible.cfg"文件内容如下所示:
[dqx@localhost ansible]$ pwd
/home/dqx/Desktop/ansible
[dqx@localhost ansible]$ ls -alh
total 8.0K
drwxrwxr-x. 2 dqx dqx 42 Oct 31 06:22 .
drwxr-xr-x. 3 dqx dqx 21 Oct 31 05:41 ..
-rw-rw-r--. 1 dqx dqx 157 Oct 31 06:22 ansible.cfg
-rw-rw-r--. 1 dqx dqx 42 Oct 31 05:44 inventory
[dqx@localhost ansible]$ cat ansible.cfg
[defaults]
inventory=./inventory
remote_user=dqx
ask_pass=false
[privilege_escalation]
become=false
become_method=sudo
become_user=root
becom_ask_pass=false[dqx@localhost ansible]$ cat inventory
192.168.133.147192.168.133.146
[centos]
192.168.133.147
[dqx@localhost ansible]$
操作系统名称 | IP地址 | 角色 | 非root用户 | root用户 |
CentOS8 Stream | 192.168.133.148 | 控制节点 | dqx | root |
CentOS7 | 192.168.133.147 | 被控制节点 | dqx | root |
CentOS7 | 192.168.133.146 | 被控制节点 | dqx | root |
三台虚拟机中的用户情况如上表所示。回到shell的输出结果当中,"pwd"表示列出当前的工作目录, "/home/dqx/Desktop/ansible"是"pwd"命令在shell中的执行结果,表示当前工作目录是"/home/dqx/Desktop/ansible","ls -alh"命令表示列出当前工作目录下包括以"."开头作为文件名称的隐藏文件在内的所有文件的详细信息,并且将文件的大小的单位转换为合适的单位使得更加易读。在"ls -alh"的返回结果中,"ansible.cfg"与"inventory"即为两个ansible配置文件。通过使用cat命令将"ansible.cfg"文件的内容输出到shell中,从"[defaults]"到"ask_pass=true"之间的所有行都属于"[default]"块的配置内容,从"[privilege_escalation]"到"becom_ask_pass=false"之间的所有行都属于"[privilege_escalation]"块的配置内容。"inventory=./inventory"表示"ansible.cfg"配置文件使用的"inventory"文件是和"ansible.cfg"文件在同一目录下并且同层级的"inventory"文件,"remote_user=dqx"表示作为管理节点的主机在通过SSH连接到作为被管理节点的服务器上时使用被管理节点服务器上的dqx用户来执行Python命令。"ask_pass=false"表示管理节点主机在通过SSH连接到被管理节点服务器上时不需要提示输入SSH连接的密码,但是考虑到没有在管理节点主机上设置为采用基于密钥的认证方法,而仍然采用的是基于密码的认证方法,所以我们在正式通过Ansible管理被管理节点服务器之前,需要设置免密SSH登录。暂时忽略"[privilege_escalation]"块的配置内容。
要设置免密SSH登录,需要在作为管理节点的主机上,通过"ssh-keygen"命令生成一组公钥与私钥,之所以要通过该命令生成一组公钥与私钥,是因为之前为了让被管理节点服务器允许来自管理节点主机的SSH连接时采用的认证方式是基于密码的认证方式,而基于密码的认证方式并不会使得管理节点主机自动生成一组公钥与私钥,所以需要通过"ssh-keygen"命令生成一组公钥与私钥。通过"ls -alh ~/.ssh/"命令可以查看到在管理节点主机上的公钥与私钥:
[dqx@localhost ~]$ ls -alh ~/.ssh
total 16K
drwx------. 2 dqx dqx 57 Nov 1 06:55 .
drwx------. 19 dqx dqx 4.0K Nov 1 06:40 ..
-rw-------. 1 dqx dqx 2.6K Oct 31 05:58 id_rsa
-rw-r--r--. 1 dqx dqx 579 Oct 31 05:58 id_rsa.pub
-rw-r--r--. 1 dqx dqx 177 Oct 31 05:58 known_hosts
[dqx@localhost ~]$ cat ./.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD+iR5IYRa8M8PSWhwZHyFLCb8pwnsiNyKWyw6SLWRZ48ghJW++oeCqH9EqukR/dEc0O11L1CH0+cjeq9H9824PlN1MXMXA7rCV7XX5Cu8fWH2a/q+ezluEtXOvjUWWAk251Zi5traCFzQRPUUJOV9Rqa8Sqo+knV07AFOnzsTY/YP3Tq16qa9ZAI+UBVG2N8axgnshyA4oRGL+vE1zodxqWZY+QC7egJKw8bB3IyiYGYQbPxzqWaqmsv6op0oFmGOtPmuPMLXuKhzDsUnMPFh7W++RWveBWbm40HzUTu7PtpsThEsRpXp33Bt3Ulkj6AXqHD5tQl296hKCiB/r/bo+LIcSAben3l0wGl5tNFTbDaVgyext8qTA5kb5ruvX4Jf6oT+ngBpk9hDLSu7XBFQBcWS06D8Gatgt3JNZah4j5BbXcV9dHZ2vtIoDy2iYtIB5Q2DChetLkmee1I+UOMJWM4N+4n5kGki9Zw3UoBwB2iCp80Lhrlb28gr1WzF60+s= dqx@localhost.localdomain
[dqx@localhost ~]$ cat ./.ssh/known_hosts
[dqx@localhost ~]$ cat .ssh/known_hosts
192.168.133.147 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHb17ZDiFBmpoRrdFAQce1pEbzyLtcGNrXWmWpCxsTcCaeAnLQTzKqAbaq48ZSbxIIzgj4dlpp8Cuy4hb9vWtY8=
192.168.133.146 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDjg1FIrArIYhNXHPfzttOH1UTZEWYIfvbCBnOsO0jf4DTyQ0A6ps3NrwgxWR20whcfTn3LEd6CxvgFxFoDzt6U=
[dqx@localhost ~]$
"id_rsa"即为通过"ssh-keygen"命令生成的私钥,"id_rsa.pub"即为通过"ssh-keygen"命令生成的与"id_rsa"私钥为一对的公钥。因为公钥可以公布,私钥不可以公布,所以只通过"cat ./.ssh/id_rsa.pub"命令显示公钥的内容。在"ls -alh ~/.ssh"的结果中的"known_hosts"文件表示已被确认身份且不会被冒充的主机,在这里已经确定IP地址为"192.168.133.147"和"192.168.133.146"的主机,也就是作为被管理节点的服务器的身份。
接着将作为管理节点的主机生成的一对公私钥中的公钥传给作为被管理节点的服务器。使用命令"ssh-copy-id dqx@192.168.133.147", "ssh-copy-id root@192.168.133.147", "ssh-copy-id dqx@192.168.133.146", "ssh-copy-id root@192.168.133.146"。
[dqx@localhost ~]$ ssh-copy-id dqx@192.168.133.147
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/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: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$ ssh-copy-id root@192.168.133.147
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/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: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$ ssh-copy-id dqx@192.168.133.146
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/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: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$ ssh-copy-id root@192.168.133.146
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/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: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$
四条命令的结果均为"All keys were skipped because they already exist on the remote system.",说明已经将作为管理节点的主机的公钥传递给了作为被管理节点的两台服务器中,进而SSH免密登录设置完成。这时在作为管理节点的主机中包含"inventory"文件的"ansible"目录下,使用命令"ansible all -m ping"命令:
[dqx@localhost ansible]$ ansible all -m ping
192.168.133.146 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.133.147 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[dqx@localhost ansible]$
这就表明"Ansible"已配置成功。
相关文章:
红帽Redhat--Ansible实战1
在运行Windows操作系统的主机LAPTOP-OUR52V78上安装有VMware Workstation Player软件。因为Windows自带的虚拟机平台软件"Hyper-V"使用难度较大,而且关于在"Hyper-V"上运行虚拟机,修改虚拟机错误的相关技术博客和文章的数量稀少&…...
213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一…...

Spring 与 Spring Boot
什么是 Spring 可以理解 Spring 是一个框架。这个框架最早来源于在差不多的 20 年前的 2002 年。 在那个时候 Java 世界的开发还是以 EJB 为主,因为在这之前的大部分应用都会使用服务器客户端的应用模式。 其实这个模式在现在还是在使用的,例如 IBM 系统…...

Flutter 04 按钮Button和事件处理、弹框Dialog、Toast
一、按钮组件 1、按钮类型: 2、按钮实现效果: import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget build(BuildContext co…...
thinkphp6多用用模式下缩短路由隐藏index应用名
thinkphp6多用用模式下缩短路由隐藏index应用名方法: 找到入口文件,一般public目录下index.php 找到 $response $http->run(); 替换为如下代码即可 // 关键在此处 $_amain index; $_aother admin|common; // 匹配此条件,就按照tp默…...
AM@二阶常系数非齐次线性微分方程@待定系数法可解决的经典类型1
文章目录 abstract二阶常系数非齐次线性微分方程待定系数法可解类型类型1小结例 abstract 二阶常系数非齐次线性微分方程待定系数法可解决的经典类型1及其解法总结与应用 本文给出类型1为什么可以通过待定求出特解,并且待定函数要设成什么形式推理过程有一定工作量,而在应用中…...
大数据技术笔记
1. 大数据技术简介 大数据技术是一系列的工具和方法,它们可以帮助我们收集、存储和分析大量的数据,并将结果呈现给我们。 2. 大数据计算模式 我们需要一些方法来处理这些数据,就像我们需要各种各样的厨具来处理食材一样。这些方法被称为大…...
Vue 3 中的 Composition API
✨理解 Vue 3 中的 Composition API 🎃 Vue 3 引入了全新的 Composition API,相较于传统的 Options API,它具备许多优势和适用场景。下面将介绍 Composition API 的优势和使用场景,并为你带来更好的开发体验。 🎁 Co…...
《TCP/IP详解 卷一:协议》第5章的IPv4数据报的总长度字段出现“不需要大于576字节的IPv4数据报“相关内容的解释
《TCP/IP详解 卷一:协议》第5章的IPv4数据报的总长度字段的一些解释,出现以下内容(有省略): ....另外,主机不需要接收大于576字节的IPv4数据报.....以避免576字节的IPv4限制。 英文原文的内容(有…...
PO-java客户端连接错误can not connect to server
问题描述: 换电脑或者网络环境改变了,PO下载EST ID的jnlp提示can not connect to server*** ;**message server***这类错误 原因分析: 基本上都是PO消息服务器连接不上导致的错误,原理有均衡负载对应的IP转接后端口不…...
PM2 vs Kubernetes:在部署 Node.js 服务时使用哪个?
Node.js 已成为 Web 开发中的热门技术之一,但如果我们想成功地将 Node.js 应用程序交付给用户,我们需要考虑部署和管理这些应用程序。两个常见的选项是 PM2 和 Kubernetes。PM2 是一个用于运行和管理 Node.js 应用程序的进程管理器,它能够创建…...

配置git并把本地项目连接github
一.配置git 1.下载git(Git),但推荐使用国内镜像下载(CNPM Binaries Mirror) 选好64和版本号下载,全部点下一步 下载完成后打开终端,输入 git --version 出现版本号则说明安装成功 然后继续…...

pytorch笔记 GRUCELL
1 介绍 GRU的一个单元 2 基本使用方法 torch.nn.GRUCell(input_size, hidden_size, biasTrue, deviceNone, dtypeNone) 输入:(batch,input_size) 输出和隐藏层:(batch,hidden_size…...
不解压,也能列出文件信息
gz文件,不解压,查看压缩前文件的大小: gzip -l ~$ ll -rw-r--r-- 1 fee fee 17343450 Nov 2 12:02 xxx.log.2023-11-02T04-02-56.000.1 -rw-r--r-- 1 fee fee 3150599 Nov 2 12:02 xxx.log.2023-11-02T04-02-56.000.1.gz ~$ gzip -l gb…...

微型计算机组成原理
1、微型计算机组成 一个传统微型计算机硬件组成如下图 CPU通过地址线、数据线和控制信号线组成的本地总线(内部总线)与系统其他部分进行数据通信。 地址线用于提供内存或I/O设备的地址,即指明需要读/写数据的具体位置;数据线用…...

基站/手机是怎么知道信道情况的?
在无线通信系统中,信道的情况对信号的发送起到至关重要的作用,基站和手机根据信道的情况选择合适的资源配置和发送方式进行通信,那么基站或者手机是怎么知道信道的情况呢? 我们先来看生活中的一个例子,从A地发货到B地…...
进程/线程
进程是资源单位, 线程是执行单位。 每一个进程至少要有一个线程,启动每一个程序默认都会有一个主线程 1.多线程的两种实现 from threading import Thread#方法一 def func(name):for i in range(10):print(name, i)if __name__ __main__:t Thread(targetfunc, …...

Python 应用 之 转换音频格式
目录 一、python音频转换 1、pydub 音频包安装 2、 ffmpeg安装 1)、解压后,添加到环境变量中 2)、可以直接放在python安装目录下 3、python程序 1)、引入相关包 2)、重命名 3)、to Mp3 4…...

Oracle JDK 和OpenJDK两者有什么异同点
Oracle JDK 和 OpenJDK 是两种不同版本的 Java Development Kit(Java 开发工具包),它们都提供了用于开发 Java 程序的一系列工具和库。以下是它们之间的一些主要异同点: 相同点: 功能:在大多数情况下&…...

GPT引发智能AI时代潮流
最近GPT概念爆火,许多行业开始竞相发展AI ,工作就业也将面临跳转,目前测试就业形势就分为了两大类,一类是测试行业如功能、性能、自动化综合性人才就业技能需求,另一类便是AI测试行业的需求普遍增长,原本由…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...