插件窝 干货文章 使用 Terraform 来管理 OpenStack 集群

使用 Terraform 来管理 OpenStack 集群

OpenStack Terraform cluster network 132    来源:    2025-04-20

使用 Terraform 管理 OpenStack 集群指南

1. 准备工作

在开始使用 Terraform 管理 OpenStack 集群前,需要完成以下准备工作:

1.1 安装 Terraform

# 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

1.2 OpenStack 认证准备

获取 OpenStack 认证信息: - OpenStack 身份认证 URL (auth_url) - 用户名 (username) - 密码 (password) - 项目 ID (project_id) - 区域名称 (region)

2. 配置 Terraform Provider

创建 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"
}

3. 基础资源管理

3.1 创建网络

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
}

3.2 创建安全组

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"
  }
}

3.3 创建实例

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"
  }
}

4. 高级配置

4.1 使用变量

创建 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
  # ...
}

4.2 使用输出

创建 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
}

5. 执行 Terraform

5.1 初始化

terraform init

5.2 预览变更

terraform plan

5.3 应用变更

terraform apply

5.4 销毁资源

terraform destroy

6. 最佳实践

  1. 版本控制:将 Terraform 配置存储在版本控制系统中
  2. 模块化:将常用配置封装为模块以便重用
  3. 远程状态:使用 Terraform 后端存储状态文件
  4. 敏感数据管理:使用环境变量或 secret 管理工具处理密码等敏感信息
  5. 策略即代码:使用 Sentinel 或 OPA 实施策略控制

7. 故障排除

常见问题及解决方案:

  1. 认证失败

    • 检查 auth_url 是否正确
    • 验证用户名/密码/项目信息
    • 确认用户有足够权限
  2. 资源创建超时

    • 增加 timeout 参数
    • 检查 OpenStack 集群资源是否充足
  3. 状态不一致

    • 运行 terraform refresh 同步状态
    • 手动修复或使用 terraform taint 标记资源重建

通过以上步骤,您可以有效地使用 Terraform 管理 OpenStack 集群资源,实现基础设施即代码(IaC)的自动化管理。