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

block任务块、rescue和always、loop循环、role角色概述、role角色应用、ansible-vault、sudo提权、特殊的主机清单变量

任务块

  • 可以通过block关键字,将多个任务组合到一起
  • 可以将整个block任务组,一起控制是否要执行
    # 如果webservers组中的主机系统发行版是Rocky,则安装并启动nginx[root@pubserver ansible]# vim block1.yml---- name: block taskshosts: webserverstasks:- name: define a group of tasksblock:- name: install nginx   # 通过yum安装nginxyum:name: nginxstate: present- name: start nginx     # 通过service启动nginx服务service:name: nginxstate: startedenabled: yeswhen: ansible_distribution=="Rocky"   # 条件为真才会执行上面的任务[root@pubserver ansible]# ansible-playbook block1.yml

    rescue和always

  • block和rescue、always联合使用:

    • block中的任务都成功,rescue中的任务不执行
    • block中的任务出现失败(failed),rescue中的任务执行
    • block中的任务不管怎么样,always中的任务总是执行
[root@pubserver ansible]# vim block2.yml---- name: block testhosts: webserverstasks:- name: block / rescue / always test1block:- name: touch a filefile:path: /tmp/test1.txtstate: touchrescue:- name: touch file test2.txtfile:path: /tmp/test2.txtstate: touchalways:- name: touch file test3.txtfile:path: /tmp/test3.txtstate: touch# 执行playbook web1上将会出现/tmp/test1.txt和/tmp/test3.txt[root@pubserver ansible]# ansible-playbook block2.yml[root@web1 ~]# ls /tmp/test*.txt/tmp/test1.txt  /tmp/test3.txt# 修改上面的playbook,使block中的任务出错[root@web1 ~]# rm -f /tmp/test*.txt[root@pubserver ansible]# vim block2.yml---- name: block testhosts: webserverstasks:- name: block / rescue / always test1block:- name: touch a filefile:path: /tmp/abcd/test11.txtstate: touchrescue:- name: touch file test22.txtfile:path: /tmp/test22.txtstate: touchalways:- name: touch file test33.txtfile:path: /tmp/test33.txtstate: touch# 因为web1上没有/tmp/abcd目录,所以block中的任务失败。但是playbook不再崩溃,而是执行rescue中的任务。always中的任务总是执行[root@pubserver ansible]# ansible-playbook block2.yml[root@web1 ~]# ls /tmp/test*.txt/tmp/test22.txt  /tmp/test33.txt

loop循环

  • 相当于shell中for循环
  • ansible中循环用到的变量名是固定的,叫item
# 在test组中的主机上创建5个目录/tmp/{aaa,bbb,ccc,ddd,eee}[root@pubserver ansible]# vim loop1.yml---- name: use loophosts: webserverstasks:- name: create directoryfile:path: /tmp/{{item}}state: directoryloop: [aaa,bbb,ccc,ddd,eee]# 上面写法,也可以改为:---- name: use loophosts: webserverstasks:- name: create directoryfile:path: /tmp/{{item}}state: directoryloop: - aaa- bbb- ccc- ddd- eee[root@pubserver ansible]# ansible-playbook loop1.yml# 使用复杂变量。创建zhangsan用户,密码是123;创建lisi用户,密码是456# item是固定的,用于表示循环中的变量# 循环时,loop中每个-后面的内容作为一个整体赋值给item。# loop中{}中的内容是自己定义的,写法为key:val# 取值时使用句点表示。如下例中取出用户名就是{{item.uname}}[root@pubserver ansible]# vim loop_user.yml---- name: create usershosts: webserverstasks:- name: create multiple usersuser:name: "{{item.uname}}"password: "{{item.upass|password_hash('sha512')}}"loop:- {"uname": "zhangsan", "upass": "123"}- {"uname": "lisi", "upass": "456"}[root@pubserver ansible]# ansible-playbook  loop_user.yml

role角色

  • 为了实现playbook重用,可以使用role角色
  • 角色role相当于把任务打散,放到不同的目录中
  • 再把一些固定的值,如用户名、软件包、服务等,用变量来表示
  • role角色定义好之后,可以在其他playbook中直接调用
# 使用常规playbook,修改/etc/motd的内容# 1. 创建motd模板文件[root@pubserver ansible]# vim motdHostname: {{ansible_hostname}}     # facts变量,主机名Date: {{ansible_date_time.date}}   #  facts变量,日期Contact to: {{admin}}              # 自定义变量# 2. 编写playbook[root@pubserver ansible]# vim motd.yml---- name: modifty /etc/motdhosts: webserversvars:admin: root@tedu.cn            # 自定义名为admin的变量tasks:- name: modify motdtemplate:src: motddest: /etc/motd[root@pubserver ansible]# ansible-playbook motd.yml[root@web1 ~]# cat /etc/motd Hostname: web1Date: 2021-11-01Contact to: root@tedu.cn# 创建角色# 1. 声明角色存放的位置[root@pubserver ansible]# vim ansible.cfg [defaults]inventory = hostsroles_path = roles    # 定义角色存在当前目录的roles子目录中# 2. 创建角色目录[root@pubserver ansible]# mkdir roles# 3. 创建名为motd的角色[root@pubserver ansible]# ansible-galaxy init roles/motd[root@pubserver ansible]# ls roles/motd     # 生成了motd角色目录[root@pubserver ansible]# yum install -y tree[root@pubserver ansible]# tree roles/motd/roles/motd/├── defaults         # 定义变量的目录,优先级最低│    └── main.yml├── files            # 保存上传的文件(如copy模块用到的文件)├── handlers         # handlers任务写到这个目录的main.yml中│    └── main.yml├── meta             # 保存说明数据,如角色作者、版本等│    └── main.yml├── README.md        # 保存角色如何使用之类的说明├── tasks            # 保存任务│    └── main.yml├── templates        # 保存template模块上传的模板文件├── tests            # 保存测试用的playbook。可选│    ├── inventory│    └── test.yml└── vars             # 定义变量的位置,推荐使用的位置└── main.yml# 4. 将不同的内容分别写到对应目录的main.yml中# 4.1 创建motd模板文件[root@pubserver ansible]# vim roles/motd/templates/motdHostname: {{ansible_hostname}}Date: {{ansible_date_time.date}}Contact to: {{admin}}# 4.2 创建变量[root@pubserver ansible]# vim roles/motd/vars/main.yml  # 追加一行admin: zzg@tedu.cn# 4.3 创建任务[root@pubserver ansible]# vim roles/motd/tasks/main.yml  # 追加- name: modify motdtemplate:src: motd      # 这里的文件,自动到templates目录下查找dest: /etc/motd# 5. 创建playbook,调用motd角色[root@pubserver ansible]# vim role_motd.yml---- name: modify motd with rolehosts: webserversroles:- motd# 6. 执行playbook[root@pubserver ansible]# ansible-playbook role_motd.yml 

role练习

  1. 创建名为pkgs的角色。用于装包。包名使用变量pkg代表
  2. 创建inst_nginx.yml,调用pkgs角色,安装nginx
  3. 创建inst_mysql.yml,调用pkgs角色,安装mysql
# 1. 创建名为pkgs的角色。# 1.1 创建角色目录[root@pubserver ansible]# ansible-galaxy init roles/pkgs# 1.2 创建装包的任务,包名使用变量pkg代表[root@pubserver ansible]# vim roles/pkgs/tasks/main.yml ---# tasks file for roles/pkgs- name: install rpm pkgyum:name: "{{pkg}}"state: present# 1.3 定义变量[root@pubserver ansible]# vim roles/pkgs/defaults/main.yml ---# defaults file for roles/pkgspkg: nginx# 2. 创建inst_nginx.yml,调用pkgs角色,安装nginx[root@pubserver ansible]# vim inst_nginx.yml---- name: install nginx pkghosts: webserversroles:- pkgs[root@pubserver ansible]# ansible-playbook inst_nginx.yml# 3. 创建inst_mysql.yml,调用pkgs角色,安装mysql-server[root@pubserver ansible]# vim inst_mysql.yml ---- name: install mysql pkghosts: dbsvars:pkg: mysql-serverroles:- pkgs[root@pubserver ansible]# ansible-playbook inst_mysql.yml
  • ansible的公共角色仓库:Ansible Galaxy
# 在公共仓库中搜索与nginx相关的角色[root@myhost ~]# ansible-galaxy search nginx# 如果找到相应的角色,如名字为mynginx,可以下载它到roles目录[root@myhost ~]# ansible-galaxy install mynginx -p roles/

ansible加解密文件

  • ansible加解密文件使用ansible-vault命令
[root@pubserver ansible]# echo "Hi ni hao" > hello.txt [root@pubserver ansible]# cat hello.txtHi ni hao# 加密文件[root@pubserver ansible]# ansible-vault encrypt hello.txtNew Vault password: 123456Confirm New Vault password: 123456Encryption successful[root@pubserver ansible]# cat hello.txt$ANSIBLE_VAULT;1.1;AES256373733663535663462356137313965666465333933613861313136323065636333363339633734656164323461356130303863633964393339363738653036310a666564313832316263393061616330323731333231623538643164353664393862666166613739363635633736343563653266373361656336636230366564650a3832396362306236333565656234613264313936346566663063306635336235# 解密[root@pubserver ansible]# ansible-vault decrypt hello.txtVault password: 123456Decryption successful[root@pubserver ansible]# cat hello.txt Hi ni hao# 加密后更改密码[root@pubserver ansible]# ansible-vault encrypt hello.txt New Vault password: 123456Confirm New Vault password: 123456Encryption successful[root@pubserver ansible]# ansible-vault rekey hello.txt   # 改密码Vault password: 123456    # 旧密码New Vault password: abcd  # 新密码Confirm New Vault password: abcdRekey successful# 不解密文件,查看内容[root@pubserver ansible]# ansible-vault view hello.txt Vault password: abcdHi ni hao# 使用密码文件进行加解密# 1. 将密码写入文件[root@pubserver ansible]# echo 'tedu.cn' > pass.txt# 2. 创建明文文件[root@pubserver ansible]# echo 'hello world' > data.txt# 3. 使用pass.txt中的内容作为密码加密文件[root@pubserver ansible]# ansible-vault encrypt --vault-id=pass.txt data.txtEncryption successful[root@pubserver ansible]# cat data.txt    # 文件已加密# 4. 使用pass.txt中的内容作为密码解密文件[root@pubserver ansible]# ansible-vault decrypt --vault-id=pass.txt data.txtDecryption successful[root@pubserver ansible]# cat data.txt hello world
  • 使用ansible管理远程主机,存储敏感数据时(如,文件中包含密码),应该将其加密
  • 执行playbook时,通过--ask-vault-password选项提示输入密码
# 1. 编写有密码的playbook[root@pubserver ansible]# vim user_zhangsan.yml---- name: create a userhosts: webserverstasks:- name: create user zhangsanuser:name: zhangsanpassword: "{{'123'|password_hash('sha512')}}"# 2. 加密playbook[root@pubserver ansible]# ansible-vault encrypt user_zhangsan.ymlNew Vault password: 123456Confirm New Vault password: 123456Encryption successful# 3. 直接执行playbook,报错[root@pubserver ansible]# ansible-playbook user_zhangsan.ymlERROR! Attempting to decrypt but no vault secrets found# 4. 使用--ask-vault-password选项[root@pubserver ansible]# ansible-playbook --ask-vault-password user_zhangsan.ymlVault password: 123456

sudo命令

  • 一般用于普通用户执行需要root权限的命令
  • 在web1上配置zhangsan拥有sudo权限
# 如果没有zhangsan,手工创建[root@web1 ~]# visudo   # 将会打开vi,在尾部追加以下一行zhangsan        ALL=(ALL)       ALL# 中间的ALL=(ALL)在集中认证的域环境中才有效,单机忽略即可# zhangsan是用户名,最后的ALL表示zhangsan可以以管理员的身份执行所有命令# 切换成zhangsan用户,执行命令[root@web1 ~]# su - zhangsan[zhangsan@web1 ~]$ useradd wangwu   # 失败,因为还是张三身份[zhangsan@web1 ~]$ sudo useradd wangwu  # 以管理员身份执行... ...[sudo] password for zhangsan: # 输入zhangsan的密码,不是root# 配置lisi不输入密码可以直接运行sudo[root@web1 ~]# visudo    # 在最后追加一行lisi    ALL=(ALL)       NOPASSWD: ALL# 切换成lisi运行[root@web1 ~]# su - lisi[lisi@web1 ~]$ ls /root/   # 没权限ls: cannot open directory '/root/': Permission denied[lisi@web1 ~]$ sudo ls /root/    # 成功运行,无需输入密码a3.txt  anaconda-ks.cfg

特殊的主机清单变量

  • 如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,可以设置特殊的主机清单变量
  • ansible_ssh_user:指定登陆远程主机的用户名
  • ansible_ssh_pass:指定登陆远程主机的密码
  • ansible_ssh_port:指定登陆远程主机的端口号
# 删除远程主机的/root/.ssh/authorized_keys,以便恢复通过密码登陆[root@pubserver ansible]# ansible all -m file -a "path=/root/.ssh/authorized_keys state=absent"# 创建新的工作目录[root@pubserver ~]# mkdir myansible[root@pubserver ~]# cd myansible[root@pubserver myansible]# vim ansible.cfg[defaults]inventory = inventory[root@pubserver myansible]# vim inventory[group1]web1web2db1[root@pubserver myansible]# ansible all -m ping  # 报错,因为无法免密执行# 修改web1 ssh服务的端口为220[root@web1 ~]# systemctl stop firewalld[root@web1 ~]# echo 'Port 220' >> /etc/ssh/sshd_config[root@web1 ~]# systemctl restart sshd# 退出再登陆时,需要指定端口号[root@myhost ~]# ssh -p220 192.168.88.11 # 配置ssh通过用户名、密码管理远程主机,通过220端口连接web1[root@pubserver myansible]# vim inventory [group1]web1 ansible_ssh_user=root ansible_ssh_pass=a ansible_ssh_port=220web2 ansible_ssh_user=root ansible_ssh_pass=adb1 ansible_ssh_user=root ansible_ssh_pass=a[root@pubserver myansible]# ansible all -m ping

相关文章:

block任务块、rescue和always、loop循环、role角色概述、role角色应用、ansible-vault、sudo提权、特殊的主机清单变量

任务块 可以通过block关键字,将多个任务组合到一起可以将整个block任务组,一起控制是否要执行 # 如果webservers组中的主机系统发行版是Rocky,则安装并启动nginx[rootpubserver ansible]# vim block1.yml---- name: block taskshosts: webse…...

Qt:QFileDialog

目录 一、介绍 二、功能 三、具体事例 1、将某个界面保存为图片,后缀名可选PNG、JPEG、SVG等 一、介绍 QFileDialog提供了一个对话框,允许用户选择文件或者目录,也允许用户遍历文件系统,用以选择一个或多个文件或者目录。 QF…...

我的QQ编程学习群

欢迎大家加入我的QQ编程学习群。 群号:950365002 群里面有许多的大学生大佬,有编程上的疑惑可以随时问,也可以聊一些休闲的东西。 热烈欢迎大家加入!! 上限:150人。...

【C++】类与对象(四)——初始化列表|explicit关键字|static成员|友元|匿名对象

前言: 初始化列表,explicit关键字,static成员,友元,匿名对象 文章目录 一、构造函数的初始化列表1.1 构造函数体内赋值1.2 初始化列表 二、explicit关键字三、static成员四、友元4.1 友元函数4.2 友元类 五、内部类六、…...

ChatGPT高效提问—prompt常见用法

ChatGPT高效提问—prompt常见用法 1.1 角色扮演 ​ prompt最为常见的用法是ChatGPT进行角色扮演。通常我们在和ChatGPT对话时,最常用的方式是一问一答,把ChatGPT当作一个单纯的“陪聊者”。而当我们通过prompt为ChatGPT赋予角色属性后,即使…...

使用vite创建vue+ts项目,整合常用插件(scss、vue-router、pinia、axios等)和配置

一、检查node版本 指令:node -v 为什么要检查node版本? Vite 需要 Node.js 版本 18,20。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。 二、创…...

泛型、Trait 和生命周期(上)

目录 1、提取函数来减少重复 2、在函数定义中使用泛型 3、结构体定义中的泛型 4、枚举定义中的泛型 5、方法定义中的泛型 6、泛型代码的性能 每一门编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型(generics)。泛型是具体类型…...

<网络安全>《18 数据安全交换系统》

1 概念 企业为了保护核心数据安全,都会采取一些措施,比如做网络隔离划分,分成了不同的安全级别网络,或者安全域,接下来就是需要建设跨网络、跨安全域的安全数据交换系统,将安全保障与数据交换功能有机整合…...

Kafka 生产调优

Kafka生产调优 文章目录 Kafka生产调优一、Kafka 硬件配置选择场景说明服务器台数选择磁盘选择内存选择CPU选择 二、Kafka Broker调优Broker 核心参数配置服役新节点/退役旧节点增加副本因子调整分区副本存储 三、Kafka 生产者调优生产者如何提高吞吐量数据可靠性数据去重数据乱…...

springboot162基于SpringBoot的体育馆管理系统的设计与实现

体育馆管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕…...

Interpolator:在Android中方便使用一些常见的CubicBezier贝塞尔曲线动画效果

说明 方便在Android中使用Interpolator一些常见的CubicBezier贝塞尔曲线动画效果。 示意图如下 import android.view.animation.Interpolator import androidx.core.view.animation.PathInterpolatorCompat/*** 参考* android https://yisibl.github.io/cubic-bezier* 实现常…...

Nacos安装,服务注册,负载均衡配置,权重配置以及环境隔离

1. 安装 首先从官网下载 nacos 安装包,注意是下载 nacos-server Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 下载完毕后,解压找到文件夹bin,文本打开startup.cmd 修改配置如下 然后双击 startup.cmd 启动 nacos服务,默认…...

Vue3导出数据为txt文件

在Vue3中,可以通过使用Blob对象以及URL.createObjectURL()方法导出txt文档。 首先,你需要在Vue组件中创建一个方法来生成txt文档的内容。 //res.value.code 数据源 //type:格式设置 //form.name是下载文件的自定义名字 const downLoad ()&…...

Simulink中getConfigSet用法

目录 语法 说明 示例 获取配置集 getConfigSet的功能是从模型中获取配置集或配置引用。 语法 myConfigObj getConfigSet(model, configObjName) 说明 myConfigObj getConfigSet(model, configObjName) 返回关联到 model 并命名为 configObjName 的配置集或配置引用。 …...

【Algorithms 4】算法(第4版)学习笔记 05 - 2.2 归并排序

文章目录 前言参考目录学习笔记1:归并排序的简单演示1.1:基本思路1.2:归并排序的 demo 演示1.3:代码实现2:自顶向下的归并排序2.1:比较次数与访问次数的证明2.2:代码优化2.3:优化后代…...

mybatis mapper sql include用法实现sql块复用

一、总SQL <select id"getxxxMonitorData"resultType"com.xxx.module.system.dal.dataobject.xxx.xxxDO"><include refid"getxxxMonitorDataBaseSql"></include><include refid"whereContent"></include&…...

正点原子--STM32通用定时器学习笔记(2)

1. 通用定时器输入捕获部分框图介绍 捕获/比较通道的输入部分&#xff08;通道1&#xff09; 采样频率&#xff1a;控制寄存器 1(TIMx_CR1)的CKD[1:0] ⬇⬇⬇​​​​​​​滤波方式选择&#xff1a; 捕获/ 比较模式寄存器 1(TIMx_CCMR1)的输入捕获部分⬇​​​​​​​⬇​…...

Flask实现异步调用sqlalchemy的模型类

事情是这样的&#xff0c;我这边需要在一次请求里面&#xff0c;搞一个异步不阻碍的任务&#xff0c;来执行耗时的操作。 一开始&#xff0c;我准备写的代码是这样的&#xff1a; from flask import Flask import time from concurrent.futures import ThreadPoolExecutorexec…...

Pocket2Mol + Generation of Atom Positions生成原子位置的方法有什么?联合概率是什么?

联合概率&#xff1a; 联合概率是统计学中的一个概念&#xff0c;用于描述两个或多个随机事件同时发生的概率。当我们谈论多个变量的联合概率时&#xff0c;我们是在探讨这些变量同时取特定值的概率。 让我们简化一下概念&#xff1a; 假设你有一个骰子&#xff08;六面&…...

区分手机小程序以及电脑小程序;左滑、导航键返回拦截

1、区分电脑小程序和手机小程序 //区分电脑小程序、手机小程序&#xff08;目标&#xff1a;手机小程序&#xff09; // #ifdef MP-WEIXIN uni.getSystemInfo({success: (res) > {// windows | mac为pc端// android | ios为手机端// console.log(getSystemInfo,, res.plat…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...