Terraform代码重载文件

2024-05-07 00:12
文章标签 代码 重载 terraform

本文主要是介绍Terraform代码重载文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一般来说Terraform会加载模块内所有的.tf.tf.json文件,并要求文件内定义了一组无重复的对象。如果两个文件尝试定义同一个对象,那么Terraform会报错。
在某些少见场景中,能够用单独的文件重载已有对象配置的特定部分将会十分有用。比如说,由工程师编写的配置文件能够在运行时被程序生成的JSON文件部分重载。

为支持这些少见场景,Terrform会对后缀名为override.tfoverride.tf.json的代码文件进行特殊处理,对于名为override.tfoverride.tf.json的代码文件也会进行相同的特殊处理。
Terraform一开始加载代码文件时会跳过这些重载文件,然后才会按照字典序一个一个处理重载文件。对重载文件中定义的所有顶级块(resourcedata等),Terraform会尝试找到对应的已有对象并且将重载内容合并进已有对象。

重载文件只应使用于特殊场景,过度使用会使得读者在阅读原始代码文件时被迫还要阅读所有的重载文件才能理解对象配置,从而降低了代码的可读性。使用重载文件时,请在原始文件被重载的部分添加相应注释,提醒未来的读者哪些部分会被重载文件修改。

示例

如果有一个名为example.tf的代码文件:

resource "aws_instance" "web" {instance_type = "t2.micro"ami           = "ami-408c7f28"
}

然后创建一个名为override.tf的文件:]

resource "aws_instance" "web" {ami = "foo"
}

Terraform随后会合并两者,最终的配置会是这样的:

resource "aws_instance" "web" {instance_type = "t2.micro"ami           = "foo"
}

合并行为

不同的块类型有着些微不同的合并行为,某些特定块内的特殊构造会以特殊形式被合并。

  • 重载文件内的顶级块会和普通文件内同类型同名的顶级块合并
  • 重载文件内的顶级块配置参数覆盖普通文件内对应块内的同名参数
  • 重载块内的内嵌块会取代普通文件内对应块内的所有同类型内嵌块,所有重载块内没有定义的内嵌块在普通文件内保持不变
  • 内嵌块的内容不会进行合并
  • 合并后的块仍然需要符合对应块类型的所有验证规则

如果有多个重载文件定义了同一个顶级块,那么重载效果是叠加的,后加载的重载块会在先前加载的重载块生效的基础上合并,重载操作首先按照文件名的字典序其次是在重载文件中的位置决定执行顺序。
有一些针对特定顶级块类型的特殊合并行为规则,将重载文件中定义的块称为重载块,重载块在普通文件中对应的块称为源块

合并resource块以及合并data块

resource块内,所有lifecycle块的内容会按照参数逐条合并。
比如说,一个重载块只定义了create_before_destroy参数而源块定义了ignore_changes,那么create_before_destroy被合并的同时igonore_changes将会被保留。

如果重载的resource块包含了一个或多个provisioner,那么源块内所有的provisioner会被忽略

如果重载的resource块内包含了一个connection块,那么它将会完全覆盖所有源块内定义的connection块。

不允许在重载块内定义depends_on参数,那将会引发一个错误。

合并variable块

variable块内参数的合并遵循上述的标准流程,但对于typedefault参数的处理会有一些特殊的考虑。
如果源块定义了default值而重载块修改了变量的type,Terraform会尝试将default值转换成新类型,如果转换失败则会报错。
如果源块定义了type参数而重载块修改了default值,那么新的default值必须能够被转换成原先的类型。

合并output块

不允许在重载块内定义depends_on参数,这会引发一个错误。

合并locals块

所有的locals块都定义了一个或多个命名值,针对locals的合并是按照命名值的名字逐条执行的,不论命名值是在哪个locals块内被定义的。

合并terraform块

如果重载块定义了required_providers参数,那么它的值会被逐条合并,这就允许重载块在不影响其他Provider的情况下调整单个Provider的版本约束。

重载块内的required_versionrequired_providers里的配置完全覆盖源块内的相应配置,如果源块和重载块都定义了required_version,那么源块的配置会被完全忽略。

这篇关于Terraform代码重载文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965783

相关文章

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实