本文详细介绍如何使用Terraform在vSphere中实现基础设施自动化,将虚拟机部署从手动操作转变为代码驱动,实现真正的IaC(Infrastructure as Code)。通过从零到生产的完整案例,让你掌握现代DevOps工程师必备技能。
第一部分:Terraform 核心概念
1.1 什么是 Terraform?
Terraform 是由 HashiCorp 开发的开源**基础设施即代码(Infrastructure as Code, IaC)**工具。
简单理解:
- 传统方式:手动点击vSphere GUI创建虚拟机
- Terraform方式:用代码描述基础设施,自动创建虚拟机
┌─────────────────────────────────────┐
│ 你的Terraform配置文件(*.tf) │
│ ├─ 网络配置 │
│ ├─ 虚拟机配置 │
│ └─ 存储配置 │
└──────────────┬──────────────────────┘
↓
Terraform 解析
↓
┌──────────────────────────────────────┐
│ 构建执行计划(Terraform Plan) │
│ ├─ 创建3个虚拟机 │
│ ├─ 配置网络 │
│ └─ 分配存储 │
└──────────────┬──────────────────────┘
↓
用户确认
↓
┌──────────────────────────────────────┐
│ 执行部署(Terraform Apply) │
│ └─ 自动调用vSphere API完成 │
└──────────────┬──────────────────────┘
↓
vSphere中自动创建
├─ web-01, web-02, web-03
├─ 配置IP地址
└─ 启动虚拟机
1.2 Terraform vs Cloud-init
两者是互补关系,不是替代关系:
| 功能 | Terraform | Cloud-init |
|---|---|---|
| 作用 | 创建虚拟机 | 初始化虚拟机 |
| 时机 | 部署前 | 首次启动时 |
| 职责 | 基础设施管理 | 操作系统配置 |
| 管理对象 | vSphere资源 | 虚拟机内部配置 |
完整流程:
Terraform创建虚拟机
↓
虚拟机启动
↓
Cloud-init自动初始化配置
↓
系统就绪
1.3 Terraform 的核心概念
Provider(提供商)
告诉Terraform如何与vSphere通信
provider "vsphere" {
user = "administrator@vsphere.local"
password = "your-password"
vsphere_server = "192.168.1.100"
allow_unverified_ssl = true
}
Resource(资源)
定义要创建什么(虚拟机、网络等)
resource "vsphere_virtual_machine" "web_server" {
name = "web-01"
# 其他配置...
}
Data Source(数据源)
获取已存在的资源信息
data "vsphere_datacenter" "dc" {
name = "Datacenter1"
}
State(状态)
Terraform记录当前基础设施的状态(terraform.tfstate文件)
这个文件非常重要,记录了所有创建的资源
如果删除了,Terraform无法追踪资源
Output(输出)
部署后输出有用的信息
output "web_server_ips" {
value = vsphere_virtual_machine.web_server[*].default_ip_address
}
第二部分:环境准备
2.1 在macOS上安装Terraform
# 使用Homebrew安装
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
# 验证安装
terraform --version
# 应该输出:Terraform v1.7.0 或更高版本
2.2 安装vSphere Provider
Terraform会自动下载Provider,但我们可以预先指定版本。
# 创建工作目录
mkdir -p ~/terraform-vsphere-work
cd ~/terraform-vsphere-work
# 创建Terraform配置文件
cat > versions.tf << 'EOF'
terraform {
required_version = ">= 1.0"
required_providers {
vsphere = {
source = "hashicorp/vsphere"
version = "~> 2.4"
}
}
}
EOF
# 初始化Terraform(会下载Provider)
terraform init
# 输出应该包含:
# - Installed hashicorp/vsphere v2.4.x
2.3 准备vSphere访问凭证
# 创建环境变量文件(不要提交到Git)
cat > credentials.tfvars << 'EOF'
vsphere_user = "administrator@vsphere.local"
vsphere_password = "your-vsphere-password"
vsphere_server = "192.168.1.100" # vCenter地址
EOF
# 创建.gitignore(防止密码泄露)
cat > .gitignore << 'EOF'
*.tfstate
*.tfstate.*
.terraform/
*.tfvars
.DS_Store
EOF
# 验证安全性
git add .gitignore
git commit -m "Add .gitignore to protect sensitive files"
第三部分:基础Terraform配置
3.1 创建最小化配置
这是一个完整的、可运行的配置,创建一个简单的虚拟机。
# main.tf
terraform {
required_providers {
vsphere = {
source = "hashicorp/vsphere"
version = "~> 2.4"
}
}
}
provider "vsphere" {
user = var.vsphere_user
password = var.vsphere_password
vsphere_server = var.vsphere_server
allow_unverified_ssl = true
}
# 获取数据中心信息
data "vsphere_datacenter" "dc" {
name = var.datacenter_name
}
# 获取数据存储信息
data "vsphere_datastore" "datastore" {
name = var.datastore_name
datacenter_id = data.vsphere_datacenter.dc.id
}
# 获取资源池信息
data "vsphere_resource_pool" "pool" {
name = var.resource_pool_name
datacenter_id = data.vsphere_datacenter.dc.id
}
# 获取网络信息
data "vsphere_network" "network" {
name = var.network_name
datacenter_id = data.vsphere_datacenter.dc.id
}
# 获取虚拟机模板
data "vsphere_virtual_machine" "template" {
name = var.template_name
datacenter_id = data.vsphere_datacenter.dc.id
}
# 定义变量
variable "vsphere_user" {
description = "vSphere用户名"
type = string
sensitive = true
}
variable "vsphere_password" {
description = "vSphere密码"
type = string
sensitive = true
}
variable "vsphere_server" {
description = "vCenter服务器地址"
type = string
}
variable "datacenter_name" {
description = "数据中心名称"
type = string
default = "Datacenter"
}
variable "datastore_name" {
description = "数据存储名称"
type = string
default = "datastore1"
}
variable "resource_pool_name" {
description = "资源池名称"
type = string
default = "Resources"
}
variable "network_name" {
description = "网络名称"
type = string
default = "VM Network"
}
variable "template_name" {
description = "虚拟机模板名称"
type = string
default = "web-template"
}
# 创建虚拟机
resource "vsphere_virtual_machine" "web_server" {
name = "web-01"
resource_pool_id = data.vsphere_resource_pool.pool.id
datastore_id = data.vsphere_datastore.datastore.id
num_cpus = 2
memory = 2048
guest_id = data.vsphere_virtual_machine.template.guest_id
network_interface {
network_id = data.vsphere_network.network.id
}
disk {
label = "disk0"
size = 20
}
clone {
template_uuid = data.vsphere_virtual_machine.template.id
customize {
linux_options {
host_name = "web-01"
domain = "example.com"
}
network_interface {
ipv4_address = "192.168.1.101"
ipv4_netmask = "24"
}
ipv4_gateway = "192.168.1.1"
}
}
}
# 输出虚拟机信息
output "web_server_ip" {
description = "Web服务器IP地址"
value = vsphere_virtual_machine.web_server.default_ip_address
}
output "web_server_name" {
description = "Web服务器名称"
value = vsphere_virtual_machine.web_server.name
}
3.2 运行Terraform
cd ~/terraform-vsphere-work
# 第1步:验证语法
terraform validate
# 输出:Success! The configuration is valid.
# 第2步:查看执行计划(不实际创建)
terraform plan -var-file=credentials.tfvars
# 输出类似:
# Terraform will perform the following actions:
#
# # vsphere_virtual_machine.web_server will be created
# + resource "vsphere_virtual_machine" "web_server" {
# + name = "web-01"
# + memory = 2048
# + num_cpus = 2
# ...
# }
#
# Plan: 1 to add, 0 to change, 0 to destroy.
# 第3步:应用配置(真正创建虚拟机)
terraform apply -var-file=credentials.tfvars
# 提示确认,输入:yes
# 输出:
# Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
#
# Outputs:
# web_server_ip = "192.168.1.101"
# web_server_name = "web-01"
现在虚拟机已在vSphere中自动创建!
第四部分:高级配置 - 批量创建虚拟机
4.1 使用count创建多个虚拟机
Count是循环创建多个相似资源的方法。
# web_servers.tf
variable "web_servers_count" {
description = "Web服务器数量"
type = number
default = 3
}
variable "web_server_config" {
description = "Web服务器配置"
type = object({
cpu = number
memory = number
})
default = {
cpu = 2
memory = 2048
}
}
# 使用count循环创建
resource "vsphere_virtual_machine" "web_servers" {
count = var.web_servers_count
name = "web-${format("%02d", count.index + 1)}"
resource_pool_id = data.vsphere_resource_pool.pool.id
datastore_id = data.vsphere_datastore.datastore.id
num_cpus = var.web_server_config.cpu
memory = var.web_server_config.memory
guest_id = data.vsphere_virtual_machine.template.guest_id
network_interface {
network_id = data.vsphere_network.network.id
}
disk {
label = "disk0"
size = 20
}
clone {
template_uuid = data.vsphere_virtual_machine.template.id
customize {
linux_options {
host_name = "web-${format("%02d", count.index + 1)}"
domain = "example.com"
}
network_interface {
ipv4_address = "192.168.1.${100 + count.index + 1}"
ipv4_netmask = "24"
}
ipv4_gateway = "192.168.1.1"
}
}
}
# 输出所有Web服务器的IP
output "web_servers_ips" {
description = "所有Web服务器的IP地址"
value = vsphere_virtual_machine.web_servers[*].default_ip_address
}
output "web_servers_names" {
description = "所有Web服务器的名称"
value = vsphere_virtual_machine.web_servers[*].name
}
使用这个配置:
# 创建3个Web服务器
terraform apply -var-file=credentials.tfvars
# 创建5个Web服务器
terraform apply -var="web_servers_count=5" -var-file=credentials.tfvars
# 减少到2个Web服务器(会删除多出的)
terraform apply -var="web_servers_count=2" -var-file=credentials.tfvars
# 查看当前状态
terraform state list
# 应输出:
# data.vsphere_datacenter.dc
# data.vsphere_datastore.datastore
# vsphere_virtual_machine.web_servers[0]
# vsphere_virtual_machine.web_servers[1]
# vsphere_virtual_machine.web_servers[2]

最低0.47元/天 解锁文章
367

被折叠的 条评论
为什么被折叠?



