.
|-- create_toml.sh
|-- main.tf
|-- modules
| |-- controlplane-node
| | |-- openstack-compute.tf
| | |-- openstack-output.tf
| | `-- openstack-vars.tf
| |-- network
| | |-- openstack-network.tf
| | `-- openstack-vars.tf
| |-- nfs-node
| | |-- openstack-compute.tf
| | |-- openstack-output.tf
| | `-- openstack-vars.tf
| |-- regi-node
| | |-- openstack-compute.tf
| | |-- openstack-output.tf
| | `-- openstack-vars.tf
| `-- worker-node
| |-- openstack-compute.tf
| |-- openstack-output.tf
| `-- openstack-vars.tf
|-- output.json
`-- variables.tf
depends_on = [ module.network ]
을 적용하여 네트워크 생성 전 인스턴스가 먼저 만들어지는 에러를 방지하기 위하여 삽입했다.terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.51.1"
}
}
}
provider "openstack" {
user_name = var.openstack_user_name
tenant_name = var.openstack_tenant_name
password = var.openstack_password
auth_url = var.openstack_auth_url
region = var.openstack_region
}
module "network" {
source = "./modules/network"
network_name = var.network_name
}
module "controlplane_node" {
source = "./modules/controlplane-node"
instance_title = var.cp_instance_title
instance_type = var.instance_type
instances = var.openstack_cluster_instance_count
public_key_file = var.public_key_file
private_key_file = var.private_key_file
image_name = var.image_name
network_name = var.network_name
depends_on = [ module.network ]
}
module "worker_node" {
source = "./modules/worker-node"
...
}
module "regi_node" {
source = "./modules/regi-node"
...
}
module "nfs_node" {
source = "./modules/nfs-node"
...
}
output "controlplane_node_ips" {
value = module.controlplane_node.ips
}
output "controlplane_node_private_ip" {
value = module.controlplane_node.private_ip
}
output "worker_node_ips" {
value = module.worker_node.ips
}
output "worker_node_private_ip" {
value = module.worker_node.private_ip
}
output "regi_node_ips" {
value = module.regi_node.ips
}
output "regi_node_private_ip" {
value = module.regi_node.private_ip
}
output "nfs_node_ips" {
value = module.nfs_node.ips
}
output "nfs_node_private_ip" {
value = module.nfs_node.private_ip
}
opstack의 인스턴스 생성 전 네트워크 구성을 먼저 해주기 위한 과정
# keypair
resource "openstack_compute_keypair_v2" "generic" {
name = "${var.network_name}-ssh"
public_key = file(var.public_key_file)
}
# 라우터 이름
resource "openstack_networking_router_v2" "generic" {
name = "${var.network_name}-router"
external_network_id = "----"
}
# 네트워크 이름
resource "openstack_networking_network_v2" "generic" {
name = "${var.network_name}-network"
}
# 서브넷 생성
resource "openstack_networking_subnet_v2" "generic" {
name = "${var.network_name}-subnet"
network_id = openstack_networking_network_v2.generic.id
cidr = "10.30.30.0/24"
dns_nameservers = ["8.8.8.8", "8.8.8.4"]
}
# Router interface configuration
resource "openstack_networking_router_interface_v2" "generic" {
router_id = openstack_networking_router_v2.generic.id
subnet_id = openstack_networking_subnet_v2.generic.id
}
# 보안 그룹 규칙 생성
resource "openstack_compute_secgroup_v2" "generic" {
name = "${var.network_name}-sg"
description = "${var.network_name}-sg"
rule {
...
}
}
# Random
resource "random_integer" "generic" {
min = 0
max = length(var.image_name) - 1
}
# Create instance
resource "openstack_compute_instance_v2" "generic" {
count = var.instances
name = "${var.instance_title}-${count.index+1}"
# image_name = var.image_name[count.index]
image_name = element(var.image_name, random_integer.generic.result + count.index % length(var.image_name))
flavor_name = var.instance_type
key_pair = "${var.network_name}-ssh"
security_groups = [
"default",
"${var.network_name}-sg"
]
network {
name = "${var.network_name}-network"
}
}
# Create floating ip
resource "openstack_networking_floatingip_v2" "generic" {
count = var.instances
pool = "public"
}
resource "openstack_compute_floatingip_associate_v2" "generic" {
count = var.instances
floating_ip = "${element(openstack_networking_floatingip_v2.generic.*.address, count.index)}"
instance_id = "${element(openstack_compute_instance_v2.generic.*.id, count.index)}"
}