Terraform + vSphere 完全指南:基础设施即代码实战

本文详细介绍如何使用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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值