terraform 变量

变量的类型

有两种类型的变量:

  • 输入变量(变量)
  • 本地值(本地)

输入变量(变量)

大多数 Terraform 项目以一种或多种方式使用变量。变量非常常见,并且有充分的理由。可以在整个项目(或模块)中访问变量(如果您要构建由一个或多个模块构成的项目)。

本地值(本地)

还有一种称为局部变量(即“局部变量”)的变量,这是整个项目无法访问的,但仅限于单个 Terraform 文件的上下文。这意味着,如果在特定 Terraform 文件中定义了本地变量,则它仅可用于该文件中的代码(但不能用于其他 Terraform 文件中的代码)。

获取变量

获取变量的内容

要使用变量,请在变量名称开头加上 var.。例如,以下 VCN 资源块中使用的 var.tenancy_ocid

resource oci_core_vcn tf_101 {
  cidr_block     = "192.168.1.0/24"
  compartment_id = var.tenancy_ocid
  display_name   = "tf-101"
  dns_label      = "tf101"
}

这看起来很熟悉。它从体验 Terraform 教程中借用!这是引用(读取和使用)tenancy_ocid 变量的方式。

获取本地内容

要使用本地变量,只需在本地变量名称前面加上 local 下面是一个示例:

resource oci_core_vcn tf_101 {
  cidr_block     = local.cidr
  compartment_id = var.tenancy_ocid
  display_name   = "tf-101"
  dns_label      = "tf101"
}

上面的示例将 cidr_block 属性设置为 cidr 本地属性中的任何属性。

设置变量值

可通过多种方法设置变量的值。设置变量的值(从最高优先级到最低优先级列出)时,Terraform 使用以下优先级顺序:

  1. CLI 参数(-var 和 -var-file CLI 参数)
  2. *.auto.tfvars
  3. terraform.tfvars
  4. 环境变量

设置本地值(本地)

本地值与常规变量略有不同(在本节的其余部分中我们将介绍)。本地(也称为“本地值”)是在 Terraform 代码本身中设置的。由于本地设置在 Terraform 代码中,因此可以以编程方式对其进行计算,从而授予使用 Terraform 函数、引用其他变量、本地和资源的功能。

下面是如何定义本地人的示例:

locals {
  comp_id = len(var.compartment_id) > 0 ? var.compartment_id : "abcd.1234"
}

以上示例是虚构的(甚至不是定义本地语言的最有效方法),但您可以了解如何设置 comp_id 本地(变量)。本地是在多个 locals 块中定义的,但引用时是单数 (local.comp_id)。

通过命令行界面

Terraform 支持许多命令行参数,其中一个是 -var 参数,允许您在运行 Terraform 时设置变量的值。下面是使用命令行设置 compartment_id 变量的示例。

$ terraform plan -var 'compartment_id=abcd.1234'

或者,您也可以使用以下格式。

$ terraform plan -var="compartment_id=abcd.1234"

可以使用此技术设置一个或多个变量。此方法有点乏味,因为它在运行 Terraform 时会导致一个非常长的命令,特别是如果设置了大量变量。每次想要运行 Terraform 时都需要使用此功能!

变量文件

以 .tfvars 结尾的文件可用于设置变量的值。您可以使用 -var-file 参数告诉 Terraform 在运行时读取哪些文件,也可以让它自动加载文件(基于其文件名)。

如果工作目录中存在 terraform.tfvars 文件,Terraform 将读取该文件并设置在那里提供的变量值。下面是一个示例 terraform.tfvars 文件:

compartment_id   = "<your_compartment_OCID_here>"
region           = "us-phoenix-1"
cidr             = "172.16.0.0/20"

这些是设置变量值(请注意,没有使用 var. 前缀)。Terraform 隐式使用 terraform.tfvars 文件设置变量值。

将静态读取 terraform.tfvars 文件,这意味着不会进行计算。Terraform 不引用其他变量、资源或其他 Terraform 函数。它仅读取静态值。

terraform.tfvars 文件通常可用于设置特定于环境的设置。它通常不会提交到 git 资源库(至少与 Terraform 代码一起使用),因为其值可能确定环境的特性。

*.auto.tfvars

您可以在 .auto.tfvars 中指定任意数量的文件,Terraform 很乐意读取这些文件并相应地设置变量值。这允许您在不同文件之间设置不同的变量定义。例如,将变量定义设置为跟随(这只是一个示例,绝不是唯一的方法):

  • network.auto.tfvars
  • storage.auto.tfvars
  • compute.auto.tfvars

这样对变量赋值进行分组可以使人员更好地在变量之间导航,尤其是在存在大量变量时。

通过环境变量

Terraform 足够智能,能够在运行时查看环境变量。如果有任何变量以 TF_VAR_ 开头(完整的环境变量为:TF_VAR_<variable_name>),则 Terraform 会将该值分配给给定的变量。

下面是如何在 MacOS/Linux 系统上设置 compartment_id 变量的示例:

export TF_VAR_compartment_id=<your_compartment_OCID_here>

此环境变量在 Windows 上可能设置如下:

setx TF_VAR_compartment_id <your_compartment_OCID_here>

通过用户交互式提示

如果未给变量赋值,Terraform 将通过请求用户在运行时提供变量。如果不知道要使用的值,Terraform 将无法继续。

这是令人烦恼的,可能很乏味(特别是如果有很多未定义的变量),但有时这种方法可能具有完美的意义。在需要用户输入值(例如确认提示)的情况下,这可能是一个很好的解决方案。

定义变量

要定义变量是否存在,只需在 Terraform 代码中的任意位置提供以下内容:

variable "compartment_id" {}

通常的做法是在单个文件中放置变量定义:variables.tf。这样可以更轻松地管理变量定义(将变量定义放在一个位置)。

除了变量名称之外,还可以为变量设置多个不同的属性,包括(但不限于):

  • 类型(type)(稍后将讨论某些常见类型)
  • 说明(description)最好让人们知道该变量的使用方式)
  • 默认(default)
  • 敏感(sensitive)

默认值

default 属性需要了解,因为其行为是多用途的。注意没有 required 属性。如果变量具有默认值,Terraform 将要求设置变量值。这意味着 default 不仅允许您提供默认值,而且还可以使变量“可选”(排序)。这真是物有所值的副作用。每个定义的变量必须具有一个值。赋予默认值(即使为空,例如 "" 或 null 的值)使 Terraform 不会“调试”运算符,这会给出需要的印象。这就是你如何看待它的问题。

某些变量最好留空(因此,如果运行 Terraform 的用户未将其设置为特定值,则非常明显)。通常,设置“sane defaults”非常好,以便对变量使用合理的默认值,从而最大程度地减少必须提供的输入量。为变量赋予默认值时,除非已覆盖(显式设置了值),否则将使用默认值。

要定义默认值,请将 default 属性添加到变量定义中。

variable "compartment_id" {
  default = "abcd.1234"
}

在上面的示例中,除非显式提供了值,否则 compartment_id 变量将使用默认值 "abcd.1234"。

敏感变量

如果将变量的敏感属性设置为 true,则 Terraform 会尝试将向用户显示的值降至最低。这不能保证用户无法访问或无法在屏幕上显示。有关详细信息,请参阅 Terraform 文档。

下面是一个示例:

variable "api_token" {
  sensitive = true
}

在上面的示例中,通过为 api_token 变量将 sensitive 属性设置为 true,将 api_token 变量的可见性最小化。

变量类型

字符串

到目前为止使用的变量是字符串值。字符串值由双引号 ("") 括起来。

compartment_id="<your_compartment_OCID_here>"

下面是在 variables.tf 中定义的:

variable tenancy_id {
  type = string
}

字符串是常见的,但绝不是唯一可以使用的类型。

数字

数字是不用引号括起来的数字值。

number_of_computes=10

下面是在 variables.tf 中定义的:

variable "number_of_computes" {
  type = number
}

布尔值

与许多其他语言一样,Terraform 支持 true 和 false 布尔值。下面是正在设置的布尔变量示例。

create_computes = true

在上面的示例中,create_computes 变量设置为 true。这对于许多事情可能非常有用,包括指定所需行为(如本示例,如果将值设置为 false,则可能无法创建计算)。

下面是在 variables.tf 中定义的:

variable "create_computes" {
  type = bool
}

列表

有时需要列表。Terraform 列表与许多其他语言的数组类似。Terraform 列表是一个指定类型的有序值列表(可以是字符串值、数字值等)。下面是字符串列表的示例。

compute_names = [ "web1", "web2", "app1", "app2", "db1", "db2" ]

下面是在 variables.tf 中定义的。

variable "compute_names" {
  type = list(string)
}

要引用列表元素,请使用项的索引。Terraform 为零索引,因此第一项是索引 0,第二项是索引 1,依此类推。查看如何引用 db1 值(从上面的列表示例,即元素 5、索引 4):

var.compute_names[4]   # this equals "db1"

Map

需要键 - 值关系的强大功能时,Terraform 映射可在此处提供帮助!映射与其他某些语言的散列类似,允许您具有多个键,每个键都有值。下面是一个映射示例。

compute_shapes = {
  "web1" = "VM.Standard2.1",
  "web2" = "VM.Standard2.1",
  "app1" = "VM.Standard2.4",
  "app2" = "VM.Standard2.4",
  "db1"  = "VM.Standard2.8",
  "db2"  = "VM.Standard2.8"
}

下面是在 variables.tf 中定义的。

variable "compute_shapes" {
  type = map(string)
}

这可能是一个数字的映射(而不是字符串)或其他有效的变量类型。

要引用映射元素,请使用项键。下面介绍如何引用 db1 值。

var.compute_shapes["db1"]   # this equals "VM.Standard2.8"

示例变量定义

下面是一个“切换”变量(布尔值,可以是 true 或 false)的示例:

variable "extra_power" {
  type = bool
  default = true
}

下面是一个更复杂变量的示例(从 terraform-oci-ocloud-foundation/assets/network/input.tf at main · oracle-devrel/terraform-oci-ocloud-foundation · GitHub 获取):

variable "subnet" {
  type = object({
    cidr_block                  = string,
    prohibit_public_ip_on_vnic  = bool, 
    dhcp_options_id             = string,
    route_table_id              = string
  })
  description                   = "Parameters for each subnet to be managed"
}

在上面的示例中,子网变量包含多个不同类型的属性(cidr_blockprohibit_public_ip_on_vnic 等)。这只是有关如何制作复杂变量的示例。不过,不要担心这一点,因为复杂变量是可选的(对于大多数用例,您可以使用单值变量)。

这些只是几个例子。你可以变得非常疯狂的变量!与他们开心,保持创意,并记住变量在很大程度上定义了 Terraform 环境的输入接口。查看 Terraform 语言文档中的输入变量来了解其他一些变量类型和 Terraform 变量功能。

 

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

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

相关文章

传输层协议 TCP UDP协议 解析(二)

文章目录 UDP&#xff1a;用户数据报协议UDP报文格式TCP与UDP的区别 UDP&#xff1a;用户数据报协议 UDP是一种面向无连接的传输层协议&#xff08;数据一直发送&#xff0c;没有ack&#xff0c;所以不需要考虑ack&#xff09;&#xff0c;传输可靠性没有保证。 UDP不提供重传…

Rust 实战thiserror+自定义错误消息体

导航 一、背景二、实践1、导入thiserror2、自定义错误消息体&#xff08;1&#xff09;创建ErrMsg.rs和创建自定义结构体&#xff08;2&#xff09;lib.rs添加ErrMsg&#xff08;3&#xff09;main函数&#xff08;4&#xff09;完整代码 一、背景 开发中遇到需要通用、能够满…

Note-backbone预训练权重对模型收敛速度的影响和mmlab实验测试

简介 在训练一些复杂模型时候&#xff0c;通常会考虑读取backbone的预训练权重&#xff0c;这种方法有以下好处&#xff1a; 初始化网络参数&#xff1a;在深度学习模型训练过程中&#xff0c;通常需要随机初始化神经网络的参数。然而&#xff0c;如果采用Backbone预训练权重进…

拼多多不花钱推广能做起来吗

拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金&#xff0c;不成交不扣费。是商家破零、积累基础销量的重要…

背景音乐广播系统解决方案

背景音乐广播系统解决方案18123651365 在公共广播背景音乐系统虽然是一个小小分支&#xff0c;但是却与人们的生活质量直接挂钩&#xff0c;如早晨时间&#xff0c;可以通过播放一些愉快的音乐&#xff0c;使得住宅居名、上班一族和晨运一族有一个愉快的心情&#xff0c;精神抖…

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置&#xff0c;并带移动动画 响应鼠标事件&#xff0c;图片缩放动画 点击水波纹动画 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #i…

剖析QMS质量管理系统:推动企业效益提升的关键因素

质量管理系统&#xff08;QMS&#xff09;是企业管理中至关重要的一环&#xff0c;它涵盖了组织的所有流程和活动&#xff0c;并旨在提高产品和服务的质量。通过实施和运营一个有效的QMS&#xff0c;企业能够不断改进其业务&#xff0c;满足客户需求&#xff0c;提高竞争力&…

书生浦语第三节茴香豆:搭建你的RAG智能助理笔记

RAG&#xff08;Retrieval Augmented Generation&#xff09;是一项通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答的技术。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供…

4月威胁态势 | 0day占比82%!Polyransom勒索家族强势来袭

近日&#xff0c;亚信安全正式发布《2024年4月威胁态势报告》&#xff08;以下简称“报告”&#xff09;&#xff0c;报告显示&#xff0c;4月份新增安全漏洞1260个&#xff0c;涉及0day漏洞占82%&#xff1b;监测发现当前较活跃的勒索病毒家族是Polyransom和Blocker&#xff0…

SPI思想机制

目录 如何解释简单概括SPI 和 APISPI 实现原理&#xff08;重要-线程上下文类加载器&#xff09; 如何使用一个Demo功能介绍使用效果&#xff08;直接在本地模拟服务商提供服务&#xff09;使用效果&#xff08;通过 jar 的方式引入&#xff09; 应用分析参考文章 如何解释 简…

Docker容器:Docker-Consul的容器服务更新与发现

目录 前言 一、什么是服务注册与发现 二、 Docker-Consul 概述 1、Consul 概念 2、Consul 提供的一些关键特性 3、Consul 的优缺点 4、传统模式与自动发现注册模式的区别 4.1 传统模式 4.2 自动发现注册模式 5、Consul 核心组件 5.1 Consul-Template组件 5.2 Consu…

Blazor流程编排的艺术:深入Z.Blazor.Diagrams库的使用与实践

合集 - .Net(3)1.基于AntSK与LLamaSharp打造私人定制的离线AI知识库03-032.深入解析&#xff1a;AntSK 0.1.7版本的技术革新与多模型管理策略03-123.Blazor流程编排的艺术&#xff1a;深入Z.Blazor.Diagrams库的使用与实践05-05收起 为现代网页应用开发提供动力的其中一…

招展工作的接近尾声“2024上海国际科技创新展会”即将盛大开幕

2024上海国际科技创新展会&#xff0c;即将于6月中旬在上海新国际博览中心盛大召开。随着招展工作的接近尾声&#xff0c;目前仍有少量余位可供各企业和机构预定。这一盛大的科技展会&#xff0c;将汇聚全球智能科技领域的精英&#xff0c;共同展示最新的科技成果&#xff0c;探…

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类&#xff0c;是对 JDBC 的封装&#xff0c;简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架&#xff0c;例如&#xff1a;MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库&#xff1a; 准备…

【JavaEE 初阶(二)】线程安全问题

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.synchronized2.1例子2.2synchronized修饰代码块2.3 synchronized修饰方法2.4sy…

one command each day on Linux- big synopsis

url address 1.12) grep Linux下面查找文本命令grep, 类似于Window编辑器的ctrlF查找我们想要的内容, PS:对比learning skill 看一下它的基础用法,准备一个目录文件和文本文件, 打印出这个单词,或者包含有这个字母的所有字符串 [rootiZ2vc5lqzt23aweti4j777Z ~]# grep hel…

智慧校园需要从哪些维度去做?

智慧校园作为校园信息化的关键产品&#xff0c;已经成为校园建设的标配。智慧校园是一个业务平台&#xff0c;他涉及校园事务的各个方面。智慧校园同时又是一个数据中心&#xff0c;他存储了所有的校园基础数据与业务数据&#xff0c;包括教工数据、学工数据、教务数据等。那么…

嘴尚绝卤味:传承经典,缔造美食新风尚

卤味&#xff0c;作为中国传统美食的代表之一&#xff0c;历经千年的传承与发展&#xff0c;早已成为无数食客餐桌上的宠儿。而在这个美食盛行的时代&#xff0c;嘴尚绝卤味凭借其独特的口感和精湛的工艺&#xff0c;成为卤味市场中的佼佼者&#xff0c;引领着卤味文化的新潮流…

基于java,SpringBoot和Vue的智慧校园在线考试留言讨论系统设计

摘要 基于Java, SpringBoot和Vue的智慧校园在线考试留言讨论系统是一个为现代教育需求定制的Web应用&#xff0c;它结合了最新的前后端技术来提供一个互动性强、用户友好的学习和交流平台。该系统旨在通过提供实时留言和讨论功能&#xff0c;增进学生间的互动以及师生之间的沟…
最新文章