私はテラフォーム モジュール (v0.14) を作成しました。このモジュールを使用して、openstack で複数のインスタンスをプロビジョニングし、正しい availability_zone、network-port、正しいフレーバーを使用して、ブール入力変数などに基づいて 1 つのローカル ディスクまたは 1 つの blockstorage_volume を作成できます。現在、複数のブロック ストレージ ボリューム (=ネットワーク/共有ストレージ ボリューム) を複数のインスタンスに動的に追加できる機能のリクエストを受け取りました。
複数のインスタンスで 1 つの blockstorage_volume に対してすべてが動的に機能する方法の例:
#Dynamically create this resource ONLY if boolean "volume_storage" = true
resource "openstack_blockstorage_volume_v3" "shared_storage" {
for_each = var.volume_storage ? var.nodes : {}
name = "${each.value}-${each.key}.${var.domain}"
size = var.volume_s
availability_zone = each.key
volume_type = var.volume_type
image_id = var.os_image
}
resource "openstack_compute_instance_v2" "instance" {
for_each = var.nodes
name = "${each.value}-${each.key}.${var.domain}"
flavor_name = var.flavor
availability_zone = each.key
key_pair = var.key_pair
image_id = (var.volume_storage == true ? "" : var.os_image)
config_drive = true
#Dynamically create this parameter ONLY if boolean "volume_storage" = true
dynamic "block_device" {
for_each = var.volume_storage ? var.volume : {}
content {
uuid = openstack_blockstorage_volume_v3.shared_storage[each.key].id
source_type = "volume"
destination_type = "volume"
delete_on_termination = var.volume_delete_termination
}
}
user_data = data.template_file.cloud-init[each.key].rendered
scheduler_hints {
group = openstack_compute_servergroup_v2.servergroup.id
}
network {
port = openstack_networking_port_v2.network-port[each.key].id
}
}
2 つのインスタンスがあり、各インスタンスに 2 つの追加の blockstorage_volumes を動的に追加したいとします。私の最初のアイデアは、試しに 2 つの追加の動的リソースを追加することでした。
#Dynamically create this resource if boolean "multiple_volume_storage" = true
resource "openstack_blockstorage_volume_v3" "multiple_shared_storage" {
for_each = var.multiple_volume_storage ? var.multiple_volumes : {}
name = each.value
size = var.volume_s
availability_zone = each.key
volume_type = var.volume_type
image_id = var.os_image
}
.tf ファイルで定義された 2 つの追加の blockstorage_volumes の例:
variable "multiple_volumes" {
type = map(any)
default = {
dc1 = "/volume/mysql"
dc2 = "/volume/postgres"
}
}
.tf ファイルで定義された 2 つのインスタンスの例:
nodes = {
dc1 = "app-stage"
dc2 = "app-stage"
}
ここでは、2 つの追加の blockstorage_volumes を各インスタンスに動的にアタッチしようとしています。
resource "openstack_compute_volume_attach_v2" "attach_multiple_shared_storage" {
for_each = var.multiple_volume_storage ? var.multiple_volumes : {}
instance_id = openstack_compute_instance_v2.instance[each.key].id
volume_id = openstack_blockstorage_volume_v3.multiple_shared_storage[each.key].id
}
openstack_compute_instance_v2.instance [each.key]は、インスタンスごとに追加の blockstorage_volume を 1 つしか作成しないため、明らかに正しくありません。これを解決するクリーンでエレガントな方法はありますか? したがって、基本的に、変数「multiple_volumes」で指定されたすべてのボリュームを、var.nodes で定義されている各単一インスタンスにアタッチします。
敬具、ジョナス