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 = 8300external = 8300protocal = "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 = stringdescription = 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 = stringaddress = string})sensitive = true
}resource "some_resource" "a" {name = var.user_informaion.nameaddress = 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 = stringnullable = 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.mzph.cn/pingmian/7808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Python编程从入门到实践》day21

# 昨日知识点回顾 设置背景颜色 在屏幕中央绘制飞船 # 今日知识点学习 12.5 重构:方法_check_events()和_update_screen() 12.5.1 方法_check_events() import sys import pygame from Settings import Settings from Ship import Shipclass AlienInvasion:"…

基于FPGA的累加器及数码管显示VHDL代码Quartus仿真

名称:基于FPGA的累加器及数码管显示VHDL代码Quartus仿真(文末获取) 软件:Quartus 语言:VHDL 代码功能: 累加器及数码管显示 1、可以通过按键输入1~9 2、数字输入后进行累加,将累加结果显示…

【计算机科学速成课】笔记三

文章目录 17.集成电路真空管时代晶体管时代集成电路时代印刷电路板时代光刻时代 17.集成电路 Over the past six episodes, we delved into software, 过去 6 集我们聊了软件 \N 从早期编程方式到现代软件工程 from early programming efforts to modern software engineerin…

部署YUM仓库以及NFS共享服务

YUM仓库部署 一.YUM概述 YUM仓库源是一种软件包管理工具,用于在Linux系统上安装、更新和删除软件包。YUM仓库源包含了软件包的元数据信息和实际的软件包文件。用户可以通过配置YUM仓库源,从中下载和安装软件包。 常见的YUM仓库源包括: 本…

截图工具Snipaste:不仅仅是截图,更是效率的提升

在数字时代,截图工具已成为我们日常工作和生活中不可或缺的一部分。无论是用于工作汇报、学习笔记,还是日常沟通,一款好用的截图工具都能大大提升我们的效率。今天,我要向大家推荐一款功能强大且易于使用的截图软件——Snipaste。…

强大的禄得可转债自定义因子轮动系统完成,可转债三低为例子

经过几天的测试终于完成了可转债自定义因子轮动,超过1000行的源代码 我提供了服务器的数据支持自动api下载,我给大家维护数据 网页 http://120.78.132.143:8023/ 录得数据支持http://120.78.132.143:8023/lude_data_app api数据支持,我提供…

Vulnhub项目:ICA: 1

1、靶机介绍 靶机地址:ICA: 1 ~ VulnHub 2、渗透过程 首先,部署好靶机后,进行探测,发现靶机ip和本机ip,靶机ip156,本机ip146。 然后查看靶机ip有哪些端口,nmap一下。 出现22、80、3306端口&a…

【C#】.net core 6.0 MVC返回JsonResult显示API接口返回值不可被JSON反序列化

欢迎来到《小5讲堂》 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景API接口接口代码请求失败原因排查调通效果 常见返回类型相关文章 …

leetcode刷题:三数之和

题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复…

mac android studio 首次无法连接安卓手机

缺少安卓手机需要的驱动,通过安装驱动解决 macport install android-platform-tools 在macOS上安装Android平台工具,可以使用Homebrew或者MacPorts。以下是使用MacPorts安装Android平台工具的步骤: 打开终端。 输入以下命令来安装Android平…

并行执行的概念—— 《OceanBase 并行执行》系列 一

From 产品经理: 这是一份姗姗来迟的关于OceanBase并行执行的系统化产品文档。 自2019年起,并行执行功能已被许多客户应用于多种场景之中,其重要性日益凸显。然而,遗憾的是,我们始终未能提供一份详尽的用户使用文档&…

initramfs及rpm/dracut操作

一、背景 更新bundle包后发现系统异常。 定位发现驱动升级不成功,内核启动后加载的还是更新前的旧驱动。但等内核启动完成后,卸载旧驱动手动insmod新驱动,是可以加载成功的。 驱动的安装目录在/lib/modules/$KERNELVERSION/extra目录下。 …

VMware下Ubuntu的安装教程

文章目录 一、Ubuntu如何下载1.下载官方地址https://ubuntu.com/2.点选Ubuntu服务器版本3.点击下载Ubuntu服务器版本iso镜像二、VMware安装Ubuntu服务器系统1.创建虚拟机2.选择下载好的Ubuntu服务器镜像3.创建安装完成三、Ubuntu Server如何设置1.Ubuntu Server没有中文所以全都…

突破AI迷雾:英特尔携手星环科技打造向量数据库革新方案,直降大模型幻觉

去年爆火的大模型,正在从百模大战走向千行百业落地应用。不过行业数据规模有限,企业数据隐私安全的要求等等因素,都让行业大模型的准确率面临挑战。近期发布的《CSDN AI 开发者生态报告》数据显示,“缺乏数据/数据质量问题”在大模…

CSS优先级的大小计算方式

CSS优先级是用来确定多个CSS规则应用于同一个元素时的顺序。计算CSS优先级遵循以下规则: 在CSS规则中使用的选择器越具体,优先级越高。选择器的具体性是通过选择器的组成部分进行计算的。 ID选择器比属性选择器和类选择器具有更高的优先级。类选择器和属…

Pycharm远程同步的mapping与sync

用Pycharm进行项目远程部署的时候会遇到两个同步文件,一个是点击 tools—>deployment—>configration——>mapping 一个是链接虚拟环境的时候会有一个sync,那么这两种同步有什么区别呢? 区别就是,2包括1,要用…

常见错误以及如何纠正它们

团队和关键结果目标 (OKR) 之间的关系是深刻且至关重要的。总而言之,一切都应该是相互关联的。正如《团队的智慧》一书中所强调的: 在团队中,没有什么比每个成员对共同目标和一组相关绩效目标的承诺更重要的了,而团队对此负有共同…

【热门话题】实用Chrome命令:提升前端开发效率的利器

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 实用Chrome命令:提升前端开发效率的利器引言目录1. 快速打开Chrome …

Django调用MTP服务器给指定邮箱发送邮件

Django调用MTP服务器发送邮箱 邮箱的激活链接含有用户数据不能直接发送需要对其进行加密 发送邮箱是借助SMTP服务器进行中转 一. 配置SMTP服务中的邮箱信息以及激活链接 1. 配置邮箱权限 打开网易邮箱设置点击POP3 开启选项 注 : 在打开的过程中会弹出授权密码一点要保存 …

C++ 递归函数

一 递归函数 递归函数(Recursive Function)即自调用函数,即在函数体内有直接或间接地自己调用自己的语句。 大多数递归函数都能够用非递归函数代替。 例如:求两个整数a,b的最大公约数。 算法描述: 大多数递归函数都能用非递归…