自动运维工具terraform,零基础入门到精通,收藏这篇就够了

一、简介

Terraform 是一款开源的基础设施即代码(IaC)工具,由 HashiCorp 开发。它允许用户通过声明式配置文件定义和管理云基础设施资源,支持跨云平台操作,包括 AWS、阿里云、Azure 等主流公有云,以及 VMware 等私有云环境。

通过 Terraform,用户可以实现基础设施的版本控制、自动化部署和跨团队协作,大幅提升运维效率和资源管理的一致性。

图解 1:Terraform 工作流程

二、安装步骤

2.1 在 Linux 上安装
# 下载最新版本(请替换版本号)
wget https://releases.hashicorp.com/terraform/1.9.0/terraform_1.9.0_linux_amd64.zip

# 解压
unzip terraform_1.9.0_linux_amd64.zip

# 移动到系统路径
sudo mv terraform /usr/local/bin/

# 验证安装
terraform --version
2.2 在 Windows 上安装
  1. 访问Terraform 官网下载 Windows 版本的 ZIP 文件
  2. 解压文件,将 terraform.exe 放到自定义目录(如 C:\terraform)
  3. 将该目录添加到系统环境变量 PATH 中
  4. 打开命令提示符,运行terraform --version验证安装
2.3 在 macOS 上安装
# 使用Homebrew
brew tap hashicorp/tap
brew install hashicorp/tap/terraform

# 验证安装
terraform --version

三、基本配置

3.1 配置云厂商凭证

Terraform 通过环境变量或配置文件获取云厂商凭证,以 AWS 为例:

# 临时环境变量配置
export AWS_ACCESS_KEY_ID="your_access_key"
export AWS_SECRET_ACCESS_KEY="your_secret_key"

对于阿里云:

export ALICLOUD_ACCESS_KEY="your_access_key"
export ALICLOUD_SECRET_KEY="your_secret_key"
export ALICLOUD_REGION="cn-beijing"
3.2 初始化工作目录

创建工作目录并初始化:

# 创建目录
mkdir terraform-demo && cd terraform-demo

# 初始化(会下载对应云厂商的Provider)
terraform init

图解 2:初始化过程

四、核心概念与语法

4.1 资源(Resource)

资源是 Terraform 管理的基础设施组件,如 EC2 实例、VPC 等:

# AWS EC2实例示例
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  
  tags = {
    Name = "WebServer"
  }
}
4.2 变量(Variable)

通过变量提高配置灵活性:

# 定义变量
variable "instance_type" {
  description = "The type of EC2 instance"
  type        = string
  default     = "t2.micro"
}

# 使用变量
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = var.instance_type
}
4.3 输出(Output)

定义部署完成后需要展示的信息:

output "instance_public_ip" {
  description = "The public IP of the EC2 instance"
  value       = aws_instance.web_server.public_ip
}
4.4 模块(Module)

模块用于组织和复用配置:

# 使用官方VPC模块
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "3.14.0"
  
  name = "my-vpc"
  cidr = "10.0.0.0/16"
  
  azs             = ["us-east-1a", "us-east-1b"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24"]
}

五、常用命令

# 初始化工作目录
terraform init

# 格式化配置文件
terraform fmt

# 验证配置文件
terraform validate

# 预览执行计划
terraform plan

# 执行部署
terraform apply

# 销毁资源
terraform destroy

# 查看状态
terraform show

# 刷新状态
terraform refresh

# 输出信息
terraform output

图解 3:Terraform 命令流程

六、实际应用案例

6.1 部署 AWS EC2 实例与安全组
    1. 创建[main.tf](http://main.tf/ "main.tf"):
provider "aws" {
  region = "us-east-1"
}

# 安全组配置
resource "aws_security_group" "web_sg" {
  name        = "web-security-group"
  description = "Allow HTTP and SSH access"
  
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  
  tags = {
    Name = "web-sg"
  }
}

# EC2实例配置
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  vpc_security_group_ids = [aws_security_group.web_sg.id]
  
  user_data = <<-EOF
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              echo "<h1>Hello from Terraform</h1>" > /var/www/html/index.html
              EOF
  
  tags = {
    Name = "WebServer"
  }
}

output "public_ip" {
  value = aws_instance.web_server.public_ip
}

output "public_dns" {
  value = aws_instance.web_server.public_dns
}
    2. 执行部署:
# 初始化
terraform init

# 预览
terraform plan

# 部署
terraform apply -auto-approve
    3. 访问输出的 public\_ip,即可看到部署的网页

    4. 清理资源:
terraform destroy -auto-approve
6.2 跨云平台部署(AWS + 阿里云)
# AWS配置
provider "aws" {
  region = "us-east-1"
}

resource "aws_s3_bucket" "aws_bucket" {
  bucket = "terraform-cross-cloud-demo-aws"
  tags = {
    Name = "CrossCloudDemo"
  }
}

# 阿里云配置
provider "alicloud" {
  region = "cn-beijing"
}

resource "alicloud_oss_bucket" "ali_bucket" {
  bucket = "terraform-cross-cloud-demo-ali"
  acl    = "private"
  tags = {
    Name = "CrossCloudDemo"
  }
}

output "aws_bucket_url" {
  value = "https://${aws_s3_bucket.aws_bucket.bucket}.s3.amazonaws.com"
}

output "ali_bucket_url" {
  value = "https://${alicloud_oss_bucket.ali_bucket.bucket}.oss-cn-beijing.aliyuncs.com"
}

七、状态管理

7.1 状态文件的重要性

Terraform 的状态文件(terraform.tfstate)是核心组成部分,它记录了当前基础设施的实际状态,是 Terraform 判断资源是否需要变更的依据。状态文件包含以下关键信息:

  • 资源的实际属性值(与配置文件中的期望状态对比)

  • 资源之间的依赖关系

  • 加密的敏感数据(如密码、密钥等)

注意:状态文件包含敏感信息,应妥善保管,避免泄露。同时,状态文件需要在团队协作中共享,确保所有人使用相同的状态源。

7.2 远程状态存储

默认情况下,状态文件存储在本地,但在团队协作或生产环境中,推荐使用远程状态存储。支持的远程存储包括:

  • AWS S3

  • Azure Blob Storage

  • 阿里云 OSS

  • HashiCorp Consul

  • Terraform Cloud

7.2.1 配置 AWS S3 作为远程存储
    1. 创建 S3 桶和 DynamoDB 表(用于状态锁定):
# 远程状态配置示例(存储在s3-backend.tf)
terraform {
  backend "s3" {
    bucket         = "my-terraform-state-bucket"  # 已存在的S3桶
    key            = "terraform/state"            # 状态文件在桶中的路径
    region         = "us-east-1"
    encrypt        = true                         # 加密状态文件
    dynamodb_table = "terraform-state-lock"       # 用于状态锁定的DynamoDB表
  }
}
    2. 初始化远程后端:
terraform init

图解 4:远程状态存储工作流

7.2.2 状态锁定

远程状态存储支持状态锁定,防止多人同时修改基础设施导致冲突。当执行terraform apply时,Terraform 会自动锁定状态,操作完成后解锁。如果操作中断导致锁定未释放,可手动解锁:

terraform force-unlock <lock-id>

八、高级特性

8.1 条件判断与循环
8.1.1 条件判断(count与for_each)

使用count根据条件创建多个相同资源:

resource "aws_instance" "web_servers" {
  count         = var.environment == "production" ? 3 : 1  # 生产环境3个实例,非生产1个
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  
  tags = {
    Name = "WebServer-${count.index}"  # 索引从0开始
  }
}

使用for_each根据映射或列表创建资源:

variable "instance_names" {
  type    = list(string)
  default = ["app-1", "app-2", "app-3"]
}

resource "aws_instance" "apps" {
  for_each      = toset(var.instance_names)  # 转换为集合
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  
  tags = {
    Name = each.key  # each.key为集合中的元素
  }
}
8.1.2 动态块(dynamic)

动态块用于在资源内部根据条件生成重复的配置块(如安全组规则):

resource "aws_security_group" "dynamic_sg" {
  name        = "dynamic-sg"
  description = "Dynamic rules example"
  
  dynamic "ingress" {
    for_each = var.allowed_ports  # 变量为列表:[80, 443, 22]
    content {
      from_port   = ingress.value
      to_port     = ingress.value
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    }
  }
  
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
8.2 模块开发

模块是 Terraform 代码复用的核心方式,一个规范的模块应包含:

示例模块结构

modules/
  vpc/
    main.tf
    variables.tf
    outputs.tf
    README.md
  ec2/
    main.tf
    variables.tf
    outputs.tf

使用自定义模块:

module "my_vpc" {
  source = "./modules/vpc"  # 本地模块路径
  cidr   = "10.0.0.0/16"
  azs    = ["us-east-1a", "us-east-1b"]
}

module "web_servers" {
  source     = "./modules/ec2"
  count      = 2
  instance_type = "t2.micro"
  vpc_id     = module.my_vpc.vpc_id  # 引用模块输出
  subnet_ids = module.my_vpc.public_subnet_ids
}
8.3 工作区(Workspaces)

工作区用于隔离不同环境(如开发、测试、生产)的状态,避免状态文件冲突。

# 创建工作区
terraform workspace new dev

# 切换工作区
terraform workspace select prod

# 查看工作区列表
terraform workspace list

# 在当前工作区执行命令
terraform plan -var-file=prod.tfvars

图解 5:工作区隔离示意

九、常见问题与解决方法

9.1 状态文件损坏或丢失
  • 问题:terraform.tfstate文件损坏或丢失,导致无法管理现有资源。

  • 解决方法

  1. 若使用远程存储,重新初始化拉取远程状态:terraform init
  2. 若本地状态丢失且无远程备份,需手动导入资源:
terraform import aws_instance.web_server i-1234567890abcdef0  # 导入EC2实例
9.2 资源依赖冲突
  • 问题:资源之间的依赖关系未正确定义,导致部署失败。

  • 解决方法

    1. 使用depends\_on显式定义依赖:
    
resource "aws_instance" "app" {
  # ...其他配置...
  depends_on = [aws_db_instance.db]  # 确保数据库先部署
}
    2. 尽量通过资源引用自动推断依赖(如vpc\_id = [aws\_vpc.main.id](http://aws_vpc.main.id/ "aws_vpc.main.id"))
9.3 敏感数据泄露
  • 问题:状态文件中包含敏感数据(如密码),可能被意外泄露。

  • 解决方法

    1. 启用状态文件加密(远程存储如 S3 支持服务器端加密)
    
    2. 使用sensitive = true标记敏感变量,避免在输出中显示:
    
variable "db_password" {
  type      = string
  sensitive = true
}
    3. 优先使用云厂商的密钥管理服务(如 AWS KMS、阿里云 KMS)存储敏感数据
9.4 模块版本管理
  • 问题:模块版本更新导致配置不兼容。

  • 解决方法

    1. 在模块引用中指定固定版本:
    
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "3.14.0"  # 固定版本,避免自动升级
}
    2. 定期测试模块新版本,逐步升级

十、最佳实践

  1. 代码组织
    • 按环境拆分配置(environments/dev、environments/prod)
    • 使用模块复用代码,避免重复配置
    • 分离变量文件(terraform.tfvars、prod.tfvars)

    2. 安全管理

    • 禁止将敏感信息硬编码到配置文件
    • 使用远程状态存储并启用加密和访问控制
    • 定期轮换云厂商凭证

    3. 协作流程

    • 使用 Git 管理 Terraform 代码,通过 PR 进行代码审查
    • 强制使用远程状态和状态锁定
    • 执行terraform plan后再apply,确认变更符合预期

    4. 版本控制

    • 对 Terraform 版本进行约束:
terraform {
  required_version = "~> 1.9.0"  # 允许1.9.x系列的小版本更新
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

十一、总结

Terraform 作为一款强大的基础设施即代码工具,通过声明式配置、跨云支持和自动化部署,极大简化了云基础设施的管理。本文从基础安装、核心概念到高级特性和最佳实践,全面介绍了 Terraform 的使用方法。

掌握 Terraform 的关键在于理解其状态管理机制和模块化思想,通过规范的代码组织和协作流程,可以有效提升团队的运维效率,确保基础设施的一致性和可追溯性。

随着云原生技术的发展,Terraform 与 Kubernetes、服务网格等工具的结合将更加紧密,成为云时代基础设施管理的核心工具之一。建议在实际项目中不断实践和优化,充分发挥其优势。

这两年,IT行业面临经济周期波动与AI产业结构调整的双重压力,确实有很多运维与网络工程师因企业缩编或技术迭代而暂时失业。

很多人都在提运维网工失业后就只能去跑滴滴送外卖了,但我想分享的是,对于运维人员来说,即便失业以后仍然有很多副业可以尝试。

运维副业方向

运维,千万不要再错过这些副业机会!

第一个是知识付费类副业:输出经验打造个人IP

在线教育平台讲师

操作路径:在慕课网、极客时间等平台开设《CCNA实战》《Linux运维从入门到精通》等课程,或与培训机构合作录制专题课。
收益模式:课程销售分成、企业内训。

技术博客与公众号运营

操作路径:撰写网络协议解析、故障排查案例、设备评测等深度文章,通过公众号广告、付费专栏及企业合作变现。
收益关键:每周更新2-3篇原创,结合SEO优化与社群运营。

第二个是技术类副业:深耕专业领域变现

企业网络设备配置与优化服务

操作路径:为中小型企业提供路由器、交换机、防火墙等设备的配置调试、性能优化及故障排查服务。可通过本地IT服务公司合作或自建线上接单平台获客。
收益模式:按项目收费或签订年度维护合同。

远程IT基础设施代维

操作路径:通过承接服务器监控、日志分析、备份恢复等远程代维任务。适合熟悉Zabbix、ELK等技术栈的工程师。
收益模式:按工时计费或包月服务。

网络安全顾问与渗透测试

操作路径:利用OWASP Top 10漏洞分析、Nmap/BurpSuite等工具,为企业提供漏洞扫描、渗透测试及安全加固方案。需考取CISP等认证提升资质。
收益模式:单次渗透测试报告收费;长期安全顾问年费。

比如不久前跟我一起聊天的一个粉丝,他自己之前是大四实习的时候做的运维,发现运维7*24小时待命受不了,就准备转网安,学了差不多2个月,然后开始挖漏洞,光是补天的漏洞奖励也有个四五千,他说自己每个月的房租和饭钱就够了。

为什么我会推荐你网安是运维人员的绝佳副业&转型方向?

1.你的经验是巨大优势: 你比任何人都懂系统、网络和架构。漏洞挖掘、内网渗透、应急响应,这些核心安全能力本质上是“攻击视角下的运维”。你的运维背景不是从零开始,而是降维打击。

2.越老越吃香,规避年龄危机: 安全行业极度依赖经验。你的排查思路、风险意识和对复杂系统的理解能力,会随着项目积累而愈发珍贵,真正做到“姜还是老的辣”。

3.职业选择极其灵活: 你可以加入企业成为安全专家,可以兼职“挖洞“获取丰厚奖金,甚至可以成为自由顾问。这种多样性为你提供了前所未有的抗风险能力。

4.市场需求爆发,前景广阔: 在国家级政策的推动下,从一线城市到二三线地区,安全人才缺口正在急剧扩大。现在布局,正是抢占未来先机的黄金时刻。

运维转行学习路线

在这里插入图片描述

(一)第一阶段:网络安全筑基

1. 阶段目标

你已经有运维经验了,所以操作系统、网络协议这些你不是零基础。但要学安全,得重新过一遍——只不过这次我们是带着“安全视角”去学。

2. 学习内容

**操作系统强化:**你需要重点学习 Windows、Linux 操作系统安全配置,对比运维工作中常规配置与安全配置的差异,深化系统安全认知(比如说日志审计配置,为应急响应日志分析打基础)。

**网络协议深化:**结合过往网络协议应用经验,聚焦 TCP/IP 协议簇中的安全漏洞及防护机制,如 ARP 欺骗、TCP 三次握手漏洞等(为 SRC 漏扫中协议层漏洞识别铺垫)。

**Web 与数据库基础:**补充 Web 架构、HTTP 协议及 MySQL、SQL Server 等数据库安全相关知识,了解 Web 应用与数据库在网安中的作用。

**编程语言入门:**学习 Python 基础语法,掌握简单脚本编写,为后续 SRC 漏扫自动化脚本开发及应急响应工具使用打基础。

**工具实战:**集中训练抓包工具(Wireshark)、渗透测试工具(Nmap)、漏洞扫描工具(Nessus 基础版)的使用,结合模拟场景练习工具应用(掌握基础扫描逻辑,为 SRC 漏扫工具进阶做准备)。

(二)第二阶段:漏洞挖掘与 SRC 漏扫实战

1. 阶段目标

这阶段是真正开始“动手”了。信息收集、漏洞分析、工具联动,一样不能少。

熟练运用漏洞挖掘及 SRC 漏扫工具,具备独立挖掘常见漏洞及 SRC 平台漏扫实战能力,尝试通过 SRC 挖洞搞钱,不管是低危漏洞还是高危漏洞,先挖到一个。

2. 学习内容

信息收集实战:结合运维中对网络拓扑、设备信息的了解,强化基本信息收集、网络空间搜索引擎(Shodan、ZoomEye)、域名及端口信息收集技巧,针对企业级网络场景开展信息收集练习(为 SRC 漏扫目标筛选提供支撑)。

漏洞原理与分析:深入学习 SQL 注入、CSRF、文件上传等常见漏洞的原理、危害及利用方法,结合运维工作中遇到的类似问题进行关联分析(明确 SRC 漏扫重点漏洞类型)。

工具进阶与 SRC 漏扫应用:

  • 系统学习 SQLMap、BurpSuite、AWVS 等工具的高级功能,开展工具联用实战训练;

  • 专项学习 SRC 漏扫流程:包括 SRC 平台规则解读(如漏洞提交规范、奖励机制)、漏扫目标范围界定、漏扫策略制定(全量扫描 vs 定向扫描)、漏扫结果验证与复现;

  • 实战训练:使用 AWVS+BurpSuite 组合开展 SRC 平台目标漏扫,练习 “扫描 - 验证 - 漏洞报告撰写 - 平台提交” 全流程。
    SRC 实战演练:选择合适的 SRC 平台(如补天、CNVD)进行漏洞挖掘与漏扫实战,积累实战经验,尝试获取挖洞收益。

恭喜你,如果学到这里,你基本可以下班搞搞副业创收了,并且具备渗透测试工程师必备的「渗透技巧」、「溯源能力」,让你在黑客盛行的年代别背锅,工作实现升职加薪的同时也能开创副业创收!

如果你想要入坑黑客&网络安全,笔者给大家准备了一份:全网最全的网络安全资料包需要保存下方图片,微信扫码即可前往获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

(三)第三阶段:渗透测试技能学习

1. 阶段目标

全面掌握渗透测试理论与实战技能,能够独立完成渗透测试项目,编写规范的渗透测试报告,具备渗透测试工程师岗位能力,为护网红蓝对抗及应急响应提供技术支撑。

2. 学习内容

渗透测试核心理论:系统学习渗透测试流程、方法论及法律法规知识,明确渗透测试边界与规范(与红蓝对抗攻击边界要求一致)。

实战技能训练:开展漏洞扫描、漏洞利用、电商系统渗透测试、内网渗透、权限提升(Windows、Linux)、代码审计等实战训练,结合运维中熟悉的系统环境设计测试场景(强化红蓝对抗攻击端技术能力)。

工具开发实践:基于 Python 编程基础,学习渗透测试工具开发技巧,开发简单的自动化测试脚本(可拓展用于 SRC 漏扫自动化及应急响应辅助工具)。

报告编写指导:学习渗透测试报告的结构与编写规范,完成多个不同场景的渗透测试报告撰写练习(与 SRC 漏洞报告、应急响应报告撰写逻辑互通)。

(四)第四阶段:企业级安全攻防(含红蓝对抗)、应急响应

1. 阶段目标

掌握企业级安全攻防、护网红蓝对抗及应急响应核心技能,考取网安行业相关证书。

2. 学习内容

护网红蓝对抗专项:

  • 红蓝对抗基础:学习护网行动背景、红蓝对抗规则(攻击范围、禁止行为)、红蓝双方角色职责(红队:模拟攻击;蓝队:防御检测与应急处置);

  • 红队实战技能:强化内网渗透、横向移动、权限维持、免杀攻击等高级技巧,模拟护网中常见攻击场景;

  • 蓝队实战技能:学习安全设备(防火墙、IDS/IPS、WAF)联动防御配置、安全监控平台(SOC)使用、攻击行为研判与溯源方法;

  • 模拟护网演练:参与团队式红蓝对抗演练,完整体验 “攻击 - 检测 - 防御 - 处置” 全流程。
    应急响应专项:

  • 应急响应流程:学习应急响应 6 步流程(准备 - 检测 - 遏制 - 根除 - 恢复 - 总结),掌握各环节核心任务;

  • 实战技能:开展操作系统入侵响应(如病毒木马清除、异常进程终止)、数据泄露应急处置、漏洞应急修补等实战训练;

  • 工具应用:学习应急响应工具(如 Autoruns、Process Monitor、病毒分析工具)的使用,提升处置效率;

  • 案例复盘:分析真实网络安全事件应急响应案例(如勒索病毒事件),总结处置经验。
    其他企业级攻防技能:学习社工与钓鱼、CTF 夺旗赛解析等内容,结合运维中企业安全防护需求深化理解。

证书备考:针对网安行业相关证书考试内容(含红蓝对抗、应急响应考点)进行专项复习,参加模拟考试,查漏补缺。

运维转行网络攻防知识库分享

网络安全这行,不是会几个工具就能搞定的。你得有体系,懂原理,能实战。尤其是从运维转过来的,别浪费你原来的经验——你比纯新人强多了。

但也要沉得住气,别学了两天Web安全就觉得自己是黑客了。内网、域渗透、代码审计、应急响应,要学的还多着呢。

如果你真的想转,按这个路子一步步走,没问题。如果你只是好奇,我劝你再想想——这行要持续学习,挺累的,但也是真有意思。

关于如何学习网络安全,笔者也给大家整理好了全套网络安全知识库,需要的可以扫码获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

1、网络安全意识
在这里插入图片描述

2、Linux操作系统
在这里插入图片描述

3、WEB架构基础与HTTP协议
图片

4、Web渗透测试
在这里插入图片描述

5、渗透测试案例分享
图片

6、渗透测试实战技巧
图片

7、攻防对战实战
图片

8、CTF之MISC实战讲解
图片

关于如何学习网络安全,笔者也给大家整理好了全套网络安全知识库,需要的可以扫码获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

***********优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值