Terraform 语法配置

配置语法
  • Terraform 的配置文件都是以 .tf 为后缀
  • Terraform 支持两种模式 HCL、JSON
Provider 插件

providers 地址:Terraform Registry

Terraform 通过 provider 管理基础设施,使用 provider 与云供应商 API 进行交互,每个 Provider 都包含相关的资源和数据源。

声明 Provider

每个 Terraform 模块必须声明它需要哪些 Provider ,以便 Terraform 可以安装和使用它们。

提供者要求在一个 required_providers 块中声明。

## versions.tfterraform {required_providers {alicloud = {// Provider 源地址source = "aliyun/alicloud"// Provider 版本version = "1.208.0"}}
}
配置 Provider
  • 关键字 provider
  • Provider 名称
# Configure the Alicloud Provider
provider "PROVIDER_NAME" {// 参数配置access_key = var.alicloud.access_keysecret_key = var.alicloud.secret_keyregion     = var.region
}
  • 实例
## provider.tfprovider "alicloud" {access_key = var.alicloud.access_keysecret_key = var.alicloud.secret_keyregion     = var.region 
}
  • 阿里云提供商接受多种输入凭据进行身份验证的方式

    • Static credentials
    • Environment variables
    • Shared credentials/configuration file
    • ECS Role
    • Assume role
    • Sidecar Credentials

详细使用查看官网:Terraform Registry

配置多个 Provider

可以为同一个 Provider 定义多个配置,并选择基于每个资源或每个模块使用哪一个。这样做的主要原因是支持一个云平台的多个区域。

引用方式:

  • <PROVIDER NAME>.<ALIAS>
  • alicloud.beiling
  • alicloud.hangzhou

在其他配置文件中指定资源区域时,可以使用此模式引用

## provider.tfprovider "alicloud" {access_key = var.alicloud.access_keysecret_key = var.alicloud.secret_key
}provider "alicloud" {alias = "beijing"region = "cn-beijing-b"
}provider "alicloud" {alias = "hangzhou"region = "cn-hangzhou-a"
}
Resource 资源
  • 资源来自 Provider ,是 Terraform 中最重要的元素。每个资源块描述一个或多个基础对象,例如网络、计算实例或更高级别的组件,例如 DNS 记录。
  • 资源名称必须以字母或下划线开头,并且只能包含字母、数宇、下划线和破折号。
resource "resource_type" "name" {// resource_config
}
Resource-ECS 资源

Terraform Registry

定义一台 ECS 实例

  • 可用区
  • 安全组
  • 实例规格
  • 系统盘类型
  • 名称描达
  • 镜像
  • 实例名称
  • 交换机
  • 带宽
  • 付费类型
  • 账户密码
## alicloud_ecs.tfresource "alicloud_instance" "myecs" {// 可用区availability_zone = var.region// 安全组,需要提前定义生成security_groups = alicloud_security_group.group.*.id// 实例规格instance_type = "ecs.n1.tiny"// 系统磁盘类型system_disk_category = "cloud_efficiency"// 系统磁盘名称svstem_disk_name = "tf_svstem_disk_name"// 系统盘描述system_disk_description = "tf_system_disk_description"// 系统镜像IDimage_id = "centos7_5_X64_206_allbase_20211130.vhd"// 实例名称instance_name = "mytestecs"// 交换机,需要提前定义生成switch_id = alicloud_vswitch.vsw.id// 带宽internet_max_bandwidth_out = 1// 付费类型internet_charge_type = "PayByTraffic"// 账号密码password = "root@123"
}
Resource-DNS 资源

Terraform Registry

定义一条 DNS 解析记录

  • ZoneName: evescn.site
  • Type: A
  • Record: demo
  • 完整域名:demo.evescn.site
## alicloud_dns.tf
## TYPE A
## demo.evescn.com# 老版本 API
resource "alicloud_dns_record" "record" {name        = "evescn.com"host_record = "demo"type        = "A"value       = alicloud_instance.mytestecs.public_ip
}# 新版本 API
resource "alicloud_alidns_record" "record" {domain_name = "evescn.com"rr          = "demo"type        = "A"value       = alicloud_instance.mytestecs.public_ipremark      = "demo-web"status      = "ENABLE"
}
DataSource 
Data数据源

Terraform Registry

datasource 提供资源的数据,可以通过参数过滤数据并供其他模块引用;使用 data 块声明

  • 过滤阿里云上 centos_7 x86_64 镜像
data "alicloud_images" "images_ds" {owners     = "system"name_regex = "^centos_7"architecture = "x86_64"
}// output 把值传递出去,给其他地方引用
output "first_image_id" {value = "${data.alicloud_images.images_ds.images.0.id}"
}
DataSource 引用

ecs 配置创建替换 image_id。

resource "alicloud_instance" "myecs" {availability_zone = var.regionsecurity_groups = alicloud_security_group.group.*.idinstance_type = "ecs.n1.tiny"system_disk_category = "cloud_efficiency"svstem_disk_name = "tf_svstem_disk_name"system_disk_description = "tf_system_disk_description"// 私有 datasource output 变量,替换此处image_id = data.alicloud_images.images_ds.images.0.idinstance_name = "mytestecs"switch_id = alicloud_vswitch.vsw.idinternet_max_bandwidth_out = 1internet_charge_type = "PayByTraffic"password = "root@123"
}
Variables 变量

变量允许自定义 Terraform 模块,而无需更改模块自己的源代码。这可以实现跨不同的 Terraform 配置共享模块,使模缺可组合和可重用。

variable "alicloud_access_key" {type = string
}variable "alicloud_secret_key" {type = string
}variable "region" {type = string
}
  • variables.tf文件中定义变量;
  • 在同一个模块的所有变量中必须是唯一的;
  • 可以从环境变量或者文本文件中读取;
  • Terraform默认读取terraform.tfvars;
Variable 可选参数
  • default 变量的默认值
  • type 变量的类型
  • description 变量的描述信息
  • validation 定义变量验证规则
  • sensitive 限制变量在UI中显示
  • nullable 变量是否可为空
variable "region" {type = stringdescription = "region name"default = "cn-beijing"sensitive = true
}
Variable 参数类型
  • any
  • string
  • number
  • bool
  • list()
  • set()
  • map()
  • object([ATTR_NAME = ATTR_TYPE, ...)
  • tuple([, ...])
Variable Map

示例:使用map类型的变量来定义DNS域名

## variables.tfvariable "dns_record" {type = map(string)description = "define dns name"
}
## terraform.tfvarsdns_record = {"dev"  = "dev-nginx","stag" = "stag-nginx","prod" = "prod-nginx",
}
  • 引用环境变量

定义一条 DNS 解析记录。

## alicloud_dns.tf
## TYPE A
## demo.evescn.com# 老版本 API
resource "alicloud_dns_record" "record" {name        = "evescn.com"// 引用环境变量host_record = var.dns_record["dev"]type        = "A"value       = alicloud_instance.mytestecs.public_ip
}# 新版本 API
resource "alicloud_alidns_record" "record" {domain_name = "evescn.com"// 引用环境变量rr          = var.dns_record["dev"]type        = "A"value       = alicloud_instance.mytestecs.public_ipremark      = "demo-web"status      = "ENABLE"
}
Variable List

示例:使用list类型的变量来定义环境列表

## variables.tfvariable "env_list" {type = list(string)description = "deploy env name"
}
## terraform.tfvarsenv_list = [ "dev", "stag", "prod" ]
Variable object

示例:使用object类型的变量来定义ECS属性信息

## variables.tf
variable "ecs_info" {type = object({ ecs_image = string, ecs_name = string })
}
## terraform.tfvarsecs_info = {ecs_image = "centos_7_5_x64_20G_alibase_20211130.vhd"ecs_name = "evescn"
}
Variable 的使用方式

在变量声明后,可以使用 var.VAR_NAME 的方式引用;VAR_ NAMEvariables.tf定义;

  • 环境娈量
  • terraform.tfvars | terraform.tfvars.json
  • *.auto.tfvars | *.auto.tfvars.ison
  • 命令行 -var | -var-file
## -var
terraform apply -var="region=cn-beijing"
terraform apply -var='env_list=["dev", "stag", "prod"]' -var="region=cn-beijing"
## -var-file
terraform apply -var-file="dev.tfvars"
## env
export TF_VAR_region='cn-beijing'
export TF_VAR_env_list='["dev", "stag", "prod"]'
locals 局部变量

局部、本地变量;局部值有助于避免在配置中多次重复相同的值或表达式;

## 定义locals {ecs_name = "evescn"owner    = "evescn"
}
## 引用local.ecs_name
local.owner
Output 输出变量

output 可以打印已定义的变量,并且可以公开信息以供其他 Terraform 配置使用。输出值类似于编程语言中的返回值。

## outputs.tfoutput "dev_dns_name" {value = alicloud_dns_record.record.host_record
}
 Output 可选参数
  • description 变量的描述信息;
  • sensitive 限制变量在UI中显示;
  • depends_on 依赖关系
Output-子模块之间的引用

例如: 如果一个名为ecs_server的子模块 声明了一个名为 instance_ip_addr 的输出,则可以将该值作为module.ecs_server.instance_ip_addr

module.<MODULE NAME>.<OUTPUT NAME>

Terraform 模版

Terraform 可以更轻松地扩展基础架构并保持其配置整洁。但是,随着基础架构的增长,单个目录变得难以管理。我们这个时候就需要使用模块

Module 简介

Terraform 模块是一种可重用现有代码的方法,减少基础设施组件开发的代码量。
Terraform 模块是一个或者多个 .tf 文件集合。

实际上任何 Terraform 配置本身已经是一个模块。如果在此目录中运行 Terraform,则这些配置文件将被视为根模块

Module 语法
  • name:模块的名称,在terraform中可以使用模块名称进行引用
  • source:模块代码的路径,本地或者远程的仓库
  • version:版本信息;
module "name" {source     = "xxx.io/your-org/terraform_test_module"version    = "1.0.0"argument_1 = var.test_1argument_2 = var.test_2
}
Module 工作原理
  • 远程模块:存储到根模块下的.terraform目录中(修改后,必须get/init)
  • 本地模块:将通过软连接的方式引用本地的源目录(修改后,无需操作)

使用 terraform get 下载模块;
使用 terraform graph 查看模块; -module-depth 汇总对象;

Module 调用方式

本地文件: "./module_name"
TF注册表: "hashicorp/consul" "hashicorp/aws"

GitHub

  • http "github.com/hashicorp/example"
  • ssh "git@github.com:hashicorp/example.git"
    bucket: "bitbucket.org/hashicorp/terraform-consul-aws"

通用Git:

  • http: "git::https://example.com/vpc.git"
  • ssh: "git::ssh://username@example.com/storage.git"
Module 输入、输出变量

模块的输出值,便于其他模块引用
引用方式: module.MODULE_NAME.OUTPUT_NAME

Module 实例化

一个模块可以被多次实例化;
每个实例定义唯一的名称,指定相同的 source 来源;

module "dev_ecs" {source = "./module/ecs"instance_name = "ecs_01"
}
module "prod_ecs" {source = "./module/ecs"instance_name = "ecs_02"
}
Module 模块优点
  • 解决代码重复问题;
  • 加强代码可读性,代码整洁性;
  • 资源标准化;
  • 减少人为错误发生频率;
Expressions 表达式#

条件表达式

condition ? true_val : false_val

condition 条件 (返回值true/false)

  • true_val 条件为true的值
  • false_val 条件为false的值

DEMO-条件表达式

var.region != "" ? var.region: "cn-beijing"

当region变量存在时 region = var.region, 反之 region = “cn-beijing”

  • for表达式
[ for VAR in OBJECT : VAR]
[ for INDEX, VAR in OBJECT: "${INDEX}=${VAR}"]

借助for表达式可以对数据进行处理,生成新的数据对象;

> [ for e in var.env_list: e ]
["dev","stag","prod",
]
> [ for i,e in var.env_list: "${i} = ${e}" ]
["0 = dev","1 = stag","2 = prod",
]
> var.dns_record
tomap({"dev" = "dev.app""prod" = "prod.app""stag" = "stag.app"
})
> [ for k,v in var.dns_record : "${k} ${v}" ]
["dev dev.app","prod prod.app","stag stag.app",
]
  • splat表达式

splat 表达式提供了一种更简洁的方式来表达可以用for表达式执行的常见操作。

var.list[*].attr
> var.user_role
[{"name" = "evescn""role" = "admin"},{"name" = "hlr""role" = "develop"},
]
> var.user_role[*].name
["evescn","hlr",
]
> var.user_role.*.name
["evescn","hlr",
]
 Terraform 函数

Functions - Configuration Language | Terraform | HashiCorp Developer

Terraform 语言包括许多内置函数,可以从表达式中调用这些函数来转换。函数调用的一般语法是函数名后跟括号中以逗号分隔的参数。

function(arg1,arg2)
  • 数值函数
函数功能
max获取最大值
min获取最大值
parseint("string", N)将字符串解析为整数,N 表示转换为 N 进制

 将集合扩展为单个参数

max(1,2,3,4,5)
max([1,2,3,4,5]…)
min(1,2,3,4,5)
min([1,2,3,4,5]…)
parseint("101", 10)
  • String 字符串函数
函数功能
format格式化
join字符串拼接
replace替换字符串
split字符串分割
format("Hello %s!", "evescn")
join(",", ["name","age","title"])
replace("a=b=c", "=","-")
split(",", "name,age,title")
  • Collection 集合函数
函数功能
alltrue() anytrue()判断元素中都是、存在true
chunklist( list, size)按照指定size拆分list
compat(list)去除list中的空元素
concat(list1, list2)合并两个list
contains(list, value)判断元素是否存在list中
distinct(list)去除list中的重复元素
element(list, index)根据index获取list中的元素
list[index]根据index获取list中的元素
flatten(list,list,list)将多层list转换成单list
index(list, value)返回value元素的index
  • Map 映射函数
函数功能
length(list)计算list的长度
lookup(map,key,default)检索map的key,不存在返回default
merge(map1,map2,map3)合并map,相同key会被最后覆盖
keys(map)建map中key的list
values(map)创建map中value的list

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

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

相关文章

多线程的学习

多线程编辑&#xff1a; 可以简单理解进程是一个软件 而线程就是一个软件中多个可以同时运行的功能 实现多线程的第一种方式&#xff1a;使用Thead类我们再自己创造一个类继承于这个类我们在对Thead方法进行重写&#xff0c;注意我们再重写的时候一定要加上Override这行 我犯下…

多线程回答的滚瓜烂熟,面试官问我虚线程了解吗?我说不太了解!

Java虚拟线程&#xff08;Virtual Threads&#xff09;标志着Java在并发编程领域的一次重大飞跃&#xff0c;特别是从Java 21版本开始。这项新技术的引入旨在克服传统多线程和线程池存在的挑战。 多线程和线程池 在Java中&#xff0c;传统的多线程编程依赖于Thread类或实现Ru…

2024 年“认证杯”数学中国数学建模网络挑战赛

题目 C题 云中的海盐 巴黎气候协定提出的目标是&#xff1a;在 2100 年前&#xff0c;把全球平均气温相对于工业 革命以前的气温升幅控制在不超过 2 摄氏度的水平&#xff0c;并为 1.5 摄氏度而努力。 但事实上&#xff0c;许多之前的研究已经指出&#xff0c;全球的碳排放以及…

主从数据同步原理

2.2.主从数据同步原理 2.2.1.全量同步 主从第一次建立连接时&#xff0c;会执行全量同步&#xff0c;将master节点的所有数据都拷贝给slave节点&#xff0c;流程&#xff1a; 这里有一个问题&#xff0c;master如何得知salve是第一次来连接呢&#xff1f;&#xff1f; 有几个…

Linux操作系统的学习

Linux系统的目录结构 / 是所有目录的顶点目录结构像一颗倒挂的树 Linux常用命令 常见命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd [目录名]change directory切换目录4touch [文件名]touch如果文件不存在&#xff0c;新…

6.11物联网RK3399项目开发实录-驱动开发之定时器的使用(wulianjishu666)

嵌入式实战开发例程【珍贵收藏&#xff0c;开发必备】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tkDBNH9R3iAaHOG1Zj9q1Q?pwdt41u 定时器使用 前言 RK3399有 12 个 Timers (timer0-timer11)&#xff0c;有 12 个 Secure Timers(stimer0~stimer11) 和 2 个 …

鸿蒙实战开发-如何实现标准化数据定义与描述的功能。

介绍 本示例主要使用ohos.data.uniformTypeDescriptor 展示了标准化数据定义与描述的功能&#xff0c;在新增预置媒体文件后&#xff0c;对媒体文件的utd标准类型获取、utd类型归属类型查询、获取文件对应的utd类型的默认图标、支持自定义数据类型等功能。 实现过程中还使用到…

AcWing-直方图中最大的矩形

131. 直方图中最大的矩形 - AcWing题库 所需知识&#xff1a;单调栈 思路&#xff1a;要求最大矩形&#xff0c;所以需要使矩形的高与长的乘积最大即可&#xff0c;依次从左到右将每一列当作中心列&#xff0c;向两边扩散&#xff0c;直到两边的高都小于该列的高&#xff0c;…

Vmware虚拟机Centos7固定IP地址

1、点击编辑-虚拟网络编辑器 2、点击更改设置、修改虚拟网络配置器并确认保存&#xff08;见图&#xff09; 这个子网IP和子网掩码的前三位需要一样网关的前三位需要和子网ip一致。 3、打开设置“网络和Internet”&#xff0c;点击“更改适配器选项”&#xff0c;点击适配器VM…

PP-LCNet:一种轻量级CPU卷积神经网络

PP-LCNet: A Lightweight CPU Convolutional Neural Network 最近看了一个新的分享&#xff0c;在图像分类的任务上表现良好&#xff0c;具有很高的实践意义。 论文&#xff1a; https://arxiv.org/pdf/2109.15099.pdf项目&#xff1a; https://github.com/PaddlePaddle/Padd…

JUC并发编程2(高并发,AQS)

JUC AQS核心 当有线程想获取锁时&#xff0c;其中一个线程使用CAS的将state变为1&#xff0c;将加锁线程设为自己。当其他线程来竞争锁时会&#xff0c;判断state是不是0&#xff0c;不是自己就把自己放入阻塞队列种&#xff08;这个阻塞队列是用双向链表实现&#xff09;&am…

探索ChatGPT-Plus:AI 助手全套开源解决方案

探索ChatGPT-Plus&#xff1a;AI 助手全套开源解决方案 ChatGPT-plus是一种新型的对话生成模型&#xff0c;它是在OpenAI的ChatGPT基础上进行了改进和优化的版本。ChatGPT-plus的出现引起了广泛关注&#xff0c;因为它在对话生成方面展现出了更加出色的表现和能力。在本文中&am…

蒙特卡洛方法【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

make/makefile学习

文章目录 1、makefile函数1.1、字符串替换函数&#xff1a;subst1.2、模式字符串替换函数&#xff1a;patsubst1.3、去空格函数&#xff1a;strip1.4、查找字符串函数&#xff1a;findstring 2、、:、&#xff1f;区别 1、makefile函数 1.1、字符串替换函数&#xff1a;subst …

《QT实用小工具·二十》存款/贷款计算器

1、概述 源码放在文章末尾 该项目实现了用于存款和贷款的计算器的功能&#xff0c;如下图所示&#xff1a; 项目部分代码如下&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJ…

构造函数,原型对象,对象实例 以及原型链的关系

当我们使用构造函数new的方式创建实例对象&#xff0c;此时构造函数的.prototype属性就是实例对象的原型对象&#xff0c;实例对象可以通过.__proto__来访问到原型对象&#xff0c;同时实例对象会继承原型对象的属性方法。 构造函数和原型对象的关系其实是被包含的关系&#x…

【电子通识】普通电阻、敏感电阻、可调电阻的种类和特点

电阻的作用 在【分立元件】理解电阻 中我们知道电阻是在电路中对电流产生阻碍作用的元件。电阻是电子产品中最基本、最常用的电子元件之一。 有各产品的电路板中基本都有电阻器&#xff0c;通常起限流、滤波或分压等作用。实际上&#xff0c;电阻器的种类很多&#xff0c;根据其…

中服云数字孪生平台 3.0 版全新升级!不仅更好看,而且更好用!

近日&#xff0c;中服云数字孪生平台迎来版本升级。中服云数字孪生平台 3.0 版&#xff0c;以物联网平台 数据中台为基础&#xff0c;以 2D/3D 为展示形式&#xff0c;旨在打造一个从设备数据到孪生应用的一站式数智化平台。 中服云数字孪生平台架构 新版升级 功能急速迭代 …

4.Hexo 页面属性和模板设置

Frontmatter frontmatter基本上是可以定义的有关不同文件的信息&#xff0c;本质上是元数据 frontmatter是我们可以分配给每个内容页面的信息 在Hexo中创建文件时&#xff0c;Hexo主题可以使用该信息以不同的方式显示该内容 当在Hexo创建了一个文件&#xff0c;在source文件夹…

【JavaWeb】Tomcat服务器

目录 动态网站动态网站的特点 程序架构B/S与C/S的比较B/S技术的工作原理URL 什么是Web服务器 Web服务器、服务端、服务器的区别和联系什么是TomcatTomcat服务器的安装与配置解压缩版本Tomcat的配置添加系统变量&#xff0c;名称为CATALINA_HOME&#xff0c;值为Tomcat的安装目录…