Terraform输入变量

使用输入变量可以在创建基础设施资源时动态传入值,如果把Terraform代码看作是一个函数,那么输入变量都是函数参数。

Terraform输入变量使用variable块进行定义,如下示例:

variable "image_id" {
    type = string  # 变量类型为字符串
}

variable "availability_zone_names" {
    type = list(string) # 变量类型为列表,列表元素为字符串类型
    default = ["us-west-1a"] # 变量默认值
}

variable "docker_ports" {
    type = list(object({ # 变量类型为列表,列表元素为对象类型
        interval = number,
        external = number,
        protocal = string
    }))

    // 设置变量默认值
    default = [
        {
            interval = 8300
            external = 8300
            protocal = "tcp"
        }
    ]
}

如上示例都是合法的变量定义,紧跟在variable关键字之后的就是变量名。
在同一个Terraform模块(不包含子文件夹)中的变量名必须是唯一的,在代码中可以使用var.变量名的方式来引用变量的值。
如下关键字不能作为输入变量名:sourceversionproviderscountfor_eachlifecycledepends_onlocals

输入变量名只能在声明该变量的目录下的代码中使用,在输入变量的定义中可以指定一些属性。

输入变量类型

在输入变量块中使用type指定类型,如:

variable "name" {
    type = string # 变量类型为字符串
}

variable "ports" {
    type = list(number) # 变量类型为列表,列表元素为数字
}

定义了类型的输入变量只能被赋值为符合类型约束的值。

输入变量默认值

当Terraform无法获取一个输入变量的值时会使用其定义的默认值,如:

variable "name" {
    type = string # 变量类型为字符串
    default = "zhangsan" # 变量默认值
}

输入变量描述

可以在输入变量定义中设置描述信息,简单地向调用者描述该变量的意义和用法:

variable "imag_id" {
    type = string # 变量类型为字符串
    description = "This id of the machine image (AMI) to use the server."
}

如果在执行terraform planterraform apply时Terraform不知道某个输入变量的值,Terraform会在命令行界面上提示为输入变量设置一个值,这时候给用户展示的提示信息就是定义的输入变量描述。

注:输入变量描述并不是注释信息!

输入变量的断言

输入变量的断言是在Terraform 0.13.0开始引入的,在输入变量定义块中通过validation块定义。

variable "image_id" {
    type = string # 输入变量类型为字符串
    description = "The id of the machine image (AMI) to use for the server." # 输入变量描述信息

    validation { # 输入变量的断言
        condition = length(var.image_id) > 4 && substr(var.image_id, 0, 4) == "ami-"
        error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"."
    }
}

validation块中condition参数是一个bool类型的参数,可以用一个表达式来定义如何界定输入变量是合法的。当condition为true时输入变量合法,反之不合法。
condition表达式中只能通过var.输入变量名的方式引用当前定义的变量,并且它的计算不能产生错误。

可以使用can函数来判定表达式的执行是否会出错,如下示例:

variable "image_id" {
    type = string
    description = The id of the machine image (AMI) to use for the server.

    validation {
        condition = can(regex("^ami-", var.image_id)) # 使用can函数来判断表达式是否会执行出错
        error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"."
    }
}

condition表达式如果为false,Terraform会返回error_message中定义的错误消息(error_message中应该完整描述输入变量校验失败的原因,以及输入变量的合法约束条件)。

在命令行输出中隐藏值

该功能于Terraform v0.14.0 开始引入。

将输入变量设置为sensitive可以防止在执行terraform planterraform apply时将输入变量的值展示出来。

声明一个包含敏感数据值的输入变量需要将其sensitive属性设置为true,如下:

variable "user_information" {
    type = object({
        name = string
        address = string
    })
    sensitive = true
}

resource "some_resource" "a" {
    name = var.user_informaion.name
    address = var.user_information.address
}

如果一个输入变量被声明为是敏感的,则任何使用敏感变量的表达式都将被视为敏感的。因此在上述例子中的资源”a”的两个参数nameaddress值也将在执行terraform planterraform apply时被隐藏。

可能暴露敏感数据值的地方

sensitive输入变量是一个以配置文件为中心的概念,值会被毫无混淆地发送给Provider。但是如果该输入变量的值包含在了错误消息中,则Provider可能会暴露该输入变量值。
例如:即使’foo’是敏感值,Provider也可能返回以下错误:Invalid value 'foo' for field

如果将资源属性用作,或是作为Provider定义的资源ID的一部分,则在执行terraform apply时将会公开该值。

+ resource "random_pet" "animal" {
      + id        = (known after apply)
      + length    = 2
      + prefix    = (sensitive)
      + separator = "-"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

...

random_pet.animal: Creating...
random_pet.animal: Creation complete after 0s [id=jae-known-mongoose]

在上述示例中,资源属性prefix已经设置为sensitive敏感类型,但随后该值(“jae”)作为资源ID的一部分被公开展示了。

禁止输入变量为空

该功能自 v1.1.0开始被引入。

输入变量的nullable参数控制调用者是否可以将null值赋值给该变量。

variable "example" {
    type = string
    nullable = false
}

nullable的默认值为true,此时将null值赋值给输入变量将会覆盖其默认值;如果nullablefalse且输入变量有默认值,当把null赋值给输入变量时,Terraform将使用输入变量的默认值。
nullable参数仅仅控制输入变量的直接值可能为null值的情况,对于集合或对象类型的输入变量,仍然可以在集合元素或属性中使用null值,只要集合或对象本身不为null值即可。

给输入变量赋值

对输入变量赋值有多种方式,如:命令行参数,参数文件,环境变量,交互界面传值。

命令行参数

在Terraform命令行中使用-var="输入变量名=值"的方式给输入变量赋值。

$ terraform apply -var="image_id=ami-abc123"
$ tarraform apply -var='image_id_list=["ami-abc123","ami-def456"]'
$ terraform apply -var='image_id_map={"us-east-1":"ami-abc123","us-east-2":"ami-def456"}'

可以在一条命令中使用多个-var参数。

参数文件

参数文件的后缀名可以是.tfvars.tfvars.json.tfvars文件使用HCL语法,.tfvars.json文件使用JSON语法。
.tfvars文件为例,用HCL代码给输入变量赋值:

image_id = "ami-abc123"
available_zone_names = ["us-east-1a", "us-west-1c"]

后缀名为.tfvars.json文件用一个JSON对象来对输入变量赋值:

{
    "image_id": "ami-abc123",
    "available_zone_names": ["us-east-1a", "us-west-1c"]
}

然后在Terraform命令中使用-var-file参数指定参数文件:

$ terraform apply -var-file="testing.tfvars"
$ terraform apply -var-file="testing.tfvars.json"

有2种情况可以不用明确指定参数文件(Terraform会自动使用这2种情况下的参数文件):

  • 当前模块内存在名为terrform.tfvarsterraform.tfvars.json的文件
  • 当前模块内存在一个或多个后缀名为.auto.tfvars.auto.tfvars.json的文件

环境变量

可以设置名为TF_VAR_输入变量名的环境变量名为输入变量赋值:

$ export TF_VAR_image_id=ami-abc123
$ terraform apply

环境变量传值特别适合在自动化流水线中使用,尤其适合用来传递敏感数据的场景。

交互界面传值

当从命令行界面执行Terraform操作,Terraform无法从其他途径获取输入变量的值时,而该输入变量又未定义默认值,Terraform会进行最后的尝试,在命令行界面上以交互提示的方式让用户输入值。

输入变量值的优先级

由于存在多种输入变量的赋值方式,Terraform在加载变量值时存在有一个优先级顺序:

  1. 环境变量
  2. terraform.tfvars文件(如果存在的话)
  3. terraform.tfvars.json(如果存在的话)
  4. 所有的.auto.tfvars.auto.tfvars.json文件,以字母顺序升序处理
  5. 通过-var-var-file参数传递的变量值,按照在命令行中定义的顺序加载

如果使用上述方式均未能成功给输入变量赋值,Terraform将尝试使用默认值;对于没有定义默认值的输入变量,Terraform会尝试从命令行交互界面中获取一个用户输入的值。如果在执行Terraform命令时使用参数-input=false禁用了界面传值方式,那么将会报错。

给复杂类型的输入变量赋值

通过参数文件给定义的输入变量传值时,可以直接使用HCL语法或JSON语法对复杂类型的输入变量传值(例如:list或map)。
对于某些场景下必须使用-var命令行参数,或者环境变量传值时,可以使用单引号引用HCL语法的字面量来定义复杂类型,如:

# 采用这种方式需要手动处理引号的转义,比较容易出错
$ export TF_VAR_available_zone_names='["us-west-1d", "us-west-1b"]'

复杂类型的传值建议使用参数文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599986.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.Nginx

Nginx反向代理 将前端发送的动态请求有Nginx转发到后端服务器 那为何要多一步转发而不直接发送到后端呢? 反向代理的好处: 提高访问速度(可以在nginx做缓存,如果请求的是同样的接口地址,这样就不用多次请求后端&#…

本地运行AI大模型简单示例

一、引言 大模型LLM英文全称是Large Language Model,是指包含超大规模参数(通常在十亿个以上)的神经网络模型。2022年11月底,人工智能对话聊天机器人ChatGPT一经推出,人们利用ChatGPT这样的大模型帮助解决很多事情&am…

AUTOSAR中EcuM、ComM和CanNm的关联

ComM的内外部唤醒 ComM可以通过NM保持网络的唤醒,同时也可以通过SM激活通信,总之就像一个通信的总管。 下面通过两种唤醒源来解释ComM的状态机。 1、内部唤醒 ① 当ComM上电初始化时会首先进入NO COMMUNICATION状态,在该状态下ComM会持续循…

Linux学习之路 -- 文件 -- 文件描述符

前面介绍了与文件相关的各种操作&#xff0c;其中的各个接口都离不开一个整数&#xff0c;那就是文件描述符&#xff0c;本文将介绍文件描述符的一些相关知识。 目录 <1>现象 <2>原理 文件fd的分配规则和利用规则实现重定向 <1>现象 我们可以先通过prin…

如何根据IP获取国家省份城市名称PHP免费版

最近项目遇到需要根据IP获取用户国家功能需求&#xff0c;网上找了一下&#xff0c;很多API接口都需要付费&#xff0c;考虑为公司节约成本&#xff0c;就取找找有没有开源的 github 上面那个包含多种语言&#xff0c;下面这个只有php&#xff0c;用法很简单 $ip 114.114.114…

视频素材哪个app好?8个视频素材库免费使用

视频内容已成为现代传播中不可或缺的一部分&#xff0c;具备卓越的视频素材对于提升任何媒体作品的质量和吸引力尤为关键。这里列举的一系列精挑细选的全球视频素材网站&#xff0c;旨在为您的商业广告、社交媒体更新或任何其他类型的视觉项目提供最佳支持。 1. 蛙学府&#x…

数据结构复习/学习9--二叉树

一、堆与完全二叉树 1.堆的逻辑与物理结构 2.父节点与子节点的下标 3.大小根堆 二、堆的实现&#xff08;大根堆为例&#xff09; 注意事项总结&#xff1a; 注意堆中插入与删除数据的位置和方法与维持大根堆有序时的数据上下调整 三、堆排序 1.排升序建大堆效率高 注意事项…

VUE v-for 数据引用

VUE 的数据引用有多种方式。 直接输出数据 如果我们希望页面中直接输出数据就可以使用&#xff1a; {{ pageNumber }}双括号引用的方式即可。 在 JavaScript 中引用 如果你需要直接在代码中使用&#xff0c;直接使用变量名就可以了。 上面这张小图&#xff0c;显示了引用的…

【计组OS】访存过程以及存储层次化结构

苏泽 本专栏纯个人笔记作用 用于记录408 学习的笔记记录&#xff08;敲了两年码实在不习惯手写笔记了&#xff09; 如果能帮助到大家当然最好 但由于是工作后退下来备考 很多说法和想法都会结合实际开发的思想 可能不是那么的纯粹应试哈 希望大家挑选自己喜欢的口味食用…

纯血鸿蒙APP实战开发——自定义安全键盘案例

介绍 金融类应用在密码输入时&#xff0c;一般会使用自定义安全键盘。本示例介绍如何使用TextInput组件实现自定义安全键盘场景&#xff0c;主要包括TextInput.customKeyboard绑定自定义键盘、自定义键盘布局和状态更新等知识点。 效果图预览 实现思路 1. 使用TextInput的cu…

解决本地启动项目,用IP地址访问失败问题

解决方法&#xff1a;看看index.html页面有没有 这个标签&#xff0c;将它注释掉

Mybatis的简介和下载安装

什么是 MyBatis &#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 Java 的…

Vue3基础笔记(4)组件

目录 一.模版引用 二.组件组成 1.引入组件 2.注入组件 3.显示组件 三.组件嵌套关系 四.组件注册方式 五.组件传递数据 六.组件事件 一.模版引用 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底…

30分钟打造属于自己的Flutter内存泄漏检测工具---FlutterLeakCanary

30分钟打造属于自己的Flutter内存泄漏检测工具 思路检测Dart 也有弱引用-----WeakReference如何执行Full GC&#xff1f;如何知道一个引用他的文件路径以及类名&#xff1f; 代码实践第一步&#xff0c;实现Full GC第二步&#xff0c;如何根据对象引用&#xff0c;获取出他的类…

Python运维-日志记录、FTP、邮件提醒

本章目录如下&#xff1a; 五、日志记录 5.1、日志模块简介 5.2、logging模块的配置与使用 六、搭建FTP服务器与客户端 6.1、FTP服务器模式 6.2、搭建服务器 6.3、编写FTP客户端程序 七、邮件提醒 7.1、发送邮件 7.2、接收邮件 7.3、实例&#xff1a;将报警信息实时…

【系统架构师】-选择题(十四)

1、某企业开发信息管理系统平台进行 E-R 图设计&#xff0c;人力部门定义的是员工实体具有属性&#xff1a;员工号、姓名、性别、出生日期、联系方式和部门,培训部门定义的培训师实体具有属性:培训师号&#xff0c;姓名和职称&#xff0c;其中职称{初级培训师&#xff0c;中级培…

【每日刷题】Day33

【每日刷题】Day33 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 2. 445. 两数相加 II - 力扣&#xff08;…

pytest教程-38-钩子函数-pytest_runtest_protocol

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_collection_finish钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_runtest_protocol钩子函数的使用方法。 pytest_runtest_protocol 钩子函数在 pytest 运行单个测试用例之前…

uniapp picker组件的样式更改

不知道有没有小伙伴遇到过这个问题 我是各种穿透和层级都尝试了更改不了其样式 梳理一下 H5端 在全局app.vue下添加如下代码 .uni-picker-container .uni-picker-header{ background-color: $uni-color-pink; //picker头部背景色}.uni-picker-container .…

【busybox记录】【shell指令】uniq

目录 内容来源&#xff1a; 【GUN】【uniq】指令介绍 【busybox】【uniq】指令介绍 【linux】【uniq】指令介绍 使用示例&#xff1a; 去除重复行 - 默认输出 去除重复行 - 跳过第n段&#xff08;空格隔开&#xff09;&#xff0c;比较n1以后的内容&#xff0c;去重 去…