terraform-迭代两个链接的资源
我正在尝试编写一些代码,这些代码将采用如下输入结构:terraform-迭代两个链接的资源,terraform,Terraform,我正在尝试编写一些代码,这些代码将采用如下输入结构: projects = { "project1" = { namespaces = ["mynamespace1"] }, "project2" = { namespaces = ["mynamespace2", "mynamespace3"] } } 并为每个资源提供多个资源,
projects = {
"project1" = {
namespaces = ["mynamespace1"]
},
"project2" = {
namespaces = ["mynamespace2", "mynamespace3"]
}
}
并为每个资源提供多个资源,这将导致:
resource "rancher2_project" "project1" {
provider = rancher2.admin
cluster_id = module.k8s_cluster.cluster_id
wait_for_cluster = true
}
resource "rancher2_project" "project2" {
provider = rancher2.admin
cluster_id = module.k8s_cluster.cluster_id
wait_for_cluster = true
}
resource "rancher2_namespace" "mynamespace1" {
provider = rancher2.admin
project_id = rancher2_project.project1.id
depends_on = [rancher2_project.project1]
}
resource "rancher2_namespace" "mynamespace2" {
provider = rancher2.admin
project_id = rancher2_project.project2.id
depends_on = [rancher2_project.project2]
}
resource "rancher2_namespace" "mynamespace3" {
provider = rancher2.admin
project_id = rancher2_project.project2.id
depends_on = [rancher2_project.project2]
}
命名空间依赖于项目,需要将generate id传递到命名空间中
有没有什么好的方法可以动态地做到这一点?我们可能有很多项目/名称空间
感谢您的帮助和建议。基于数据结构系统地生成资源的多个实例的典型答案是。每个的资源
的主要要求是,每个要创建的资源实例都有一个包含一个元素的映射
在您的案例中,似乎每个项目需要一个rancher2_项目
,然后每对项目和名称空间需要一个rancher2_名称空间
。因此,您当前的数据结构已经足够用于rancher2\u项目资源:
resource "rancher2_project" "example" {
for_each = var.projects
provider = rancher2.admin
cluster_id = module.k8s_cluster.cluster_id
wait_for_cluster = true
}
上面将声明两个具有以下地址的资源实例:
rancher2\u项目。示例[“项目1”]
rancher2\u项目。示例[“项目2”]
您当前没有一个每个名称空间都有一个元素的映射,因此需要做更多的工作才能从输入数据结构中派生出合适的值。这种情况的常见模式是使用:
这将生成一个表示所有项目和命名空间对的对象列表,然后for_each
参数使用包含项目键和命名空间键的复合键将其转换为映射,以确保它们都是唯一的。因此,生成的实例将具有以下地址:
rancher2\u名称空间。示例[“project1.mynamespace1”]
rancher2\u名称空间。示例[“project2.mynamespace2”]
rancher2\u名称空间。示例[“project2.mynamespace3”]
这似乎也起作用:
resource "rancher2_namespace" "example" {
count = length(local.project_namespaces)
provider = rancher2.admin
name = local.project_namespaces[count.index].namespace_name
project_id = local.project_namespaces[count.index].project_id
}
您的示例不是迭代2个提供程序配置,而是迭代使用相同提供程序但不同项目的2个资源。您的示例中是否遗漏了一些内容?我的错误应该超过2个参考资料。非常感谢您的详细解释,我查看了扁平化函数,但不了解如何在命名空间资源中使用它。一对一对。。(0-0)我可以使用count和类似的东西来创建名称空间:local.project\u namespaces[count.index].namespace\u name,这样您就不需要再进行从列表到映射的转换。你怎么认为?
resource "rancher2_namespace" "example" {
count = length(local.project_namespaces)
provider = rancher2.admin
name = local.project_namespaces[count.index].namespace_name
project_id = local.project_namespaces[count.index].project_id
}