Terraform的认识
Terraform 是最流行的基础架构即代码(IaC)工具,用于安全的编排、构建、修改和版本化管理基础设施,其采用声明式进行管理,并会基于代码变化对基础设施进行变更,更有利于对基础设施的自动化配置;得益于Terraform良好的生态,其提供非常完整的适配,例如:
- vSphere..私有云
- AWS/GCP/Azure/Aliyun..公有云
- Kuberentes/Docker
- Gtilab/Github
- MySQL/PostgreSQL/RabbitMQ
安装terraform
对于使用MacOS的用户,那么配置好brew之后,通过命令即可安装
brew install terraform其他用户安装稍微略显复杂,本次不再展开
准备工作目录
其中、terraform存储其他资源,vmware中存储我们本次要使用的相关代码。
mkdir -p terraform/vmware编写代码
本次将创建三个文件:
- terraform/vmware/main.tf 资源入口文件:定义各种所需清单
- terraform/vmware/variables.tf 变量清单文件:定义main.tf中所需的变量名(可维护默认值)
- terraform/vmware/output.tf 信息输出文件:在虚拟机创建完成后输出的相关信息
编写terraform/vmware/main.tf
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
}
data "vsphere_datastore" "datastore" {
name = var.datastore
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_compute_cluster" "cluster" {
name = var.cluster
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_network" "network" {
name = var.portgroup
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_virtual_machine" "template" {
name = var.template_name
datacenter_id = data.vsphere_datacenter.dc.id
}
resource "vsphere_virtual_machine" "linux" {
name = var.vm_name
resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
datastore_id = data.vsphere_datastore.datastore.id
num_cpus = var.vcpu_count
memory = var.memory
guest_id = data.vsphere_virtual_machine.template.guest_id
scsi_type = data.vsphere_virtual_machine.template.scsi_type
network_interface {
network_id = data.vsphere_network.network.id
adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
}
disk {
label = "disk0"
size = data.vsphere_virtual_machine.template.disks.0.size
eagerly_scrub = data.vsphere_virtual_machine.template.disks.0.eagerly_scrub
thin_provisioned = data.vsphere_virtual_machine.template.disks.0.thin_provisioned
}
# 当模板有多块儿磁盘时需要启用该配置
# disk {
# label = "disk1"
# unit_number = "1" # 磁盘的单元编号(从0开始,每块儿编号不能重复)
# size = data.vsphere_virtual_machine.template.disks.1.size
# }
clone {
template_uuid = data.vsphere_virtual_machine.template.id
linked_clone = "true"
customize {
linux_options {
host_name = var.vm_name
domain = var.domain_name
}
network_interface {
ipv4_address = var.vm_ip
ipv4_netmask = var.vm_cidr
}
ipv4_gateway = var.default_gw
dns_server_list = [var.dns_list]
}
}
}编写 terraform/vmware/variables.tf
variable "vsphere_server" {}
variable "adminpassword" {}
variable "vsphere_user" {}
variable "vsphere_password" {}
variable "datacenter" {}
variable "datastore" {}
variable "cluster" {}
variable "portgroup" {}
variable "domain_name" {}
variable "default_gw" {}
variable "dns_list" {
default = ["114.114.114.114"]
}
variable "template_name" {}
variable "vm_name" {}
variable "vm_ip" {}
variable "vm_cidr" {}
variable "vcpu_count" {}
variable "memory" {}编写 terraform/vmware/output.tf 信息输出文件
output "DC_ID" {
description = "id of vSphere Datacenter"
value = data.vsphere_datacenter.dc.id
}
output "Linux-VM" {
description = "VM Names"
value = vsphere_virtual_machine.linux.*.name
}
output "Linux-ip" {
description = "default ip address of the deployed VM"
value = vsphere_virtual_machine.linux.*.default_ip_address
}
output "Linux-guest-ip" {
description = "all the registered ip address of the VM"
value = vsphere_virtual_machine.linux.*.guest_ip_addresses
}
output "Linux-uuid" {
description = "UUID of the VM in vSphere"
value = vsphere_virtual_machine.linux.*.uuid
}编写配置
- todo
创建虚拟机
- todo
Docker
某些场景我们可能只需要运行一次性docker容器来完成虚拟机的创建,创建完成相应资源后自动删除该容器;对于这种方式也有相对比较好的解决方法
书写dockerfile
进入terraform目录准备我们的相关资源 cd terraform
vim dockerfileFROM hashicorp/terraform:latest
# 将vmware编排内容拷贝至容器目录
COPY vmware /opt/vmware
WORKDIR /opt/vmware
# 进行初始化操作以便后续直接使用
RUN terraform init构建和运行
接着来构建terraform的docker镜像
docker build -t terraform_vmware:latest .构建完成后,准备我们的启动参数,修改下列参数尝试启动容器创建虚拟机
docker run -it --rm \
-e TF_VAR_cluster="集群名称" \
-e TF_VAR_datacenter="集群名称" \
-e TF_VAR_vsphere_server="vsphere地址(仅需IP或者域名)" \
-e TF_VAR_vsphere_user="vsphere用户" \
-e TF_VAR_vsphere_password="vsphere密码" \
-e TF_VAR_datastore="数据磁盘" \
-e TF_VAR_vm_name="虚拟机名称" \
-e TF_VAR_memory="虚拟机内存(M)" \
-e TF_VAR_vcpu_count="虚拟机CPU数" \
-e TF_VAR_template_name="模板名称" \
-e TF_VAR_adminpassword="虚拟机密码(如果允许修改)" \
-e TF_VAR_vm_ip="虚拟机IP(为空时为DHCP)" \
-e TF_VAR_vm_cidr=掩码CIDR \
-e TF_VAR_dns_list="DNS_IP" \
-e TF_VAR_default_gw="虚拟机默认网关地址" \
-e TF_VAR_portgroup="虚拟机使用的网络适配器" \
-e TF_VAR_domain_name="虚拟机子域" \
terraform_vmware apply --auto-approve当上述配置全部正确,并执行运行指令后,即可开始创建。
最后
本次所有相关代码都已上传至Git仓库:https://github.com/yaobohai/terraform_vmware