在开始使用 Terraform 管理 OpenStack 集群前,需要完成以下准备工作:
# Linux (Ubuntu/Debian)
wget https://releases.hashicorp.com/terraform/1.5.7/terraform_1.5.7_linux_amd64.zip
unzip terraform_1.5.7_linux_amd64.zip
sudo mv terraform /usr/local/bin/
# 验证安装
terraform version
获取 OpenStack 认证信息: - OpenStack 身份认证 URL (auth_url) - 用户名 (username) - 密码 (password) - 项目 ID (project_id) - 区域名称 (region)
创建 provider.tf
文件配置 OpenStack provider:
terraform {
required_version = ">= 1.0.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.53.0"
}
}
}
provider "openstack" {
auth_url = "https://your-openstack-identity:5000/v3"
user_name = "your-username"
password = "your-password"
tenant_name = "your-project-name"
region = "RegionOne"
}
resource "openstack_networking_network_v2" "cluster_network" {
name = "cluster-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "cluster_subnet" {
name = "cluster-subnet"
network_id = openstack_networking_network_v2.cluster_network.id
cidr = "192.168.100.0/24"
ip_version = 4
}
resource "openstack_compute_secgroup_v2" "cluster_secgroup" {
name = "cluster-security-group"
description = "Security group for cluster nodes"
rule {
from_port = 22
to_port = 22
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
rule {
from_port = 80
to_port = 80
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
rule {
from_port = 443
to_port = 443
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
}
resource "openstack_compute_instance_v2" "cluster_node" {
count = 3
name = "cluster-node-${count.index}"
image_name = "Ubuntu 20.04"
flavor_name = "m1.medium"
key_pair = "your-keypair-name"
security_groups = [openstack_compute_secgroup_v2.cluster_secgroup.name]
network {
name = openstack_networking_network_v2.cluster_network.name
}
metadata = {
role = "worker"
}
}
创建 variables.tf
:
variable "node_count" {
description = "Number of worker nodes"
type = number
default = 3
}
variable "flavor_name" {
description = "Instance flavor"
type = string
default = "m1.medium"
}
更新实例资源引用变量:
resource "openstack_compute_instance_v2" "cluster_node" {
count = var.node_count
# ...
flavor_name = var.flavor_name
# ...
}
创建 outputs.tf
:
output "node_ips" {
description = "IP addresses of cluster nodes"
value = openstack_compute_instance_v2.cluster_node[*].access_ip_v4
}
output "network_id" {
description = "Cluster network ID"
value = openstack_networking_network_v2.cluster_network.id
}
terraform init
terraform plan
terraform apply
terraform destroy
常见问题及解决方案:
认证失败:
资源创建超时:
状态不一致:
terraform refresh
同步状态terraform taint
标记资源重建通过以上步骤,您可以有效地使用 Terraform 管理 OpenStack 集群资源,实现基础设施即代码(IaC)的自动化管理。