将一个大的XML分解为多个tf资源



我计划创建一个地形提供程序来构建一个巨大的XML文件。使用XML文件的服务只有一个巨大的XML文件作为单个资源。在下面的示例中,这个缝合的xml是唯一的资源。

<Main>
<ChildA Id="childA">
<GrandChildA></GrandChildA>
<GrandChildA></GrandChildA>
<GrandChildA></GrandChildA>
</ChildA>
<ChildB Id="childB">
<GrandChildB>
<GreatGrandChildB></GreatGrandChildB>
</GrandChildB>
</ChildB>
</Main>

我想把它分解成更小的部分,但ChildAChildB不是服务中的实际资源,只是Main的一部分。我在hashicups提供者的例子中找不到任何例子,从我从awsazurekubernetes等其他提供者那里注意到的情况来看,资源代表了服务中的实际资源。

resource "main_element" "main_1" {
childA = child_a_element.child_a_1
childB = child_b_element.child_b_1
} 
resource "child_a_element" "child_a_1" {
id = "childA"
... other config here
}
resource "child_b_element" "child_b_1" {
id = "childB"
... other config here
}

我该如何着手实现这一点?它们应该是resources还是data_sources

对于如此概括的示例,我不确定我是否完全理解情况,但我认为您所说的是远程API对整个";主";对象,包括它的所有子项,作为一个单独的单元,必须一起创建、更新和销毁。

如果这是真的,那么Terraform中最合适的表示形式将是单个资源类型,其中嵌套块表示XML中的每个嵌套元素。

在多个Terraform资源中分割单个远程对象通常是不现实的,因为每个资源都有单独的生命周期,因此提供者不能将多个资源实例的处理直接协调为一个操作。Terraform提供者的角色通常只是调整底层的API设计以适应Terraform的模型,而不是在底层的API概念之上创建重要的新抽象。

您在这里定义的特定XML结构实际上非常适合表示为映射的嵌套块类型,使用映射键作为XML:中的Id属性

resource "main" "example" {
child_a "childA" {
grandchild_a {
}
grandchild_a {
}
grandchild_a {
}
}
child_b "childB" {
grandchild_b {
great_grandchild_b {
}
}
}
}

不幸的是,这种嵌套块类型接受标签并表示为映射的结构在当前版本的Terraform SDK中不受支持(在我写这篇文章时,v2.2.0是最新的(。Terraform v0.12.0中添加了这种功能,SDK最近才放弃了对Terraform v0.11的向后兼容性支持,所以它还不支持这种结构。

因此,与当前SDK中的最接近的是child_achild_b都被定义为TypeSet,并且有一个嵌套的id必需参数,如下所示:

resource "main" "example" {
child_a {
id = "childA"
grandchild_a {
}
grandchild_a {
}
grandchild_a {
}
}
child_b "child" {
id = "childB"
grandchild_b {
great_grandchild_b {
}
}
}
}

(为了完整起见:在我写这篇文章的时候,HashiCorp的Terraform SDK团队正在开发一个新的基础库,该库实现了底层Terraform插件协议以及该协议目前支持的所有功能。它的抽象级别比v2 SDK低得多,但旨在用作未来支持新的SDK版本的基础功能。在我写这篇文章的时候,它是实验性的,但我之所以提到它,是因为一旦停止的实验性,这个答案可能仍然存在,而且对于有独特需求的提供商来说,如果高级抽象正在阻碍,那么针对这个较低级别的API实现它可能会有所帮助。(

最新更新