赞
踩
用Terraform的语言编写配置文件,告诉Terraform需要安装哪些插件、创建哪些基础设施。
配置文件的后缀通常为.tf,或者使用json格式编写配置文件时其后缀为.tf.json。配置文件的编码必须为UTF-8。
terraform init初始化工作空间后目录下会出现以下文件。
Terraform 语言的语法仅包含几个基本元素:
- <BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
- # Block body
- <IDENTIFIER> = <EXPRESSION> # Argument
- }
Terraform依赖的组件成为providers。Terraform配置必须声明需要哪些providers,以便可以安装和使用它们。
provider一般会提供 resource的类型 和 DATA SOURCE
Terraform具体支持哪些provider可以在这里查看:Terraform Registry
示例
- provider "alicloud" {
- access_key = "your_ak_xxx"
- secret_key = "your_sk_xxx"
- region = "cn-shenzhen"
- }
可以选择为同一个提供者定义多个配置,并选择基于每个资源或每个模块使用哪一个。这样做的主要原因是支持一个云平台的多个区域等场景。
- # The default provider configuration; resources that begin with `aws_` will use
- # it as the default, and it can be referenced as `aws`.
- provider "aws" {
- region = "us-east-1"
- }
-
- # Additional provider configuration for west coast region; resources can
- # reference this as `aws.west`.
- provider "aws" {
- alias = "west"
- region = "us-west-2"
- }
resource和module不指定提供者时,默认以alias值的第一个单词推断默认的provider
多配置下,resource可以用provider参数指定使用哪个提供者
- resource "aws_instance" "foo" {
- provider = aws.west
-
- # ...
- }
多配置下,子模块可以用providers参数指定使用哪些提供者
- module "aws_vpc" {
- source = "./aws_vpc"
- providers = {
- aws = aws.west
- }
- }
Terraform0.13以及更高版本中,provider块的version参数已启用。取而代之的似乎使用required_providers块指定provider的版本。
required_providers由本地名称、源位置、版本约束组成:
本地名称(mycloud)、源位置(source)、版本约束(version)
- terraform {
- required_providers {
- mycloud = {
- source = "mycorp/mycloud"
- version = "~> 1.0"
- }
- }
- }
-
- provider "mycloud" {
- # ...
- }
本地名称 优先使用provider建议的首选本地名称
源位置 缺省时,默认为 registry.terraform.io/hashicorp/<LOCAL NAME>
版本约束 =>1.0 定义最低使用1.0版本;~>1.0定义 最高使用1.0版本
- resource "aws_instance" "web" {
- ami = "ami-a1b2c3d4"
- instance_type = "t2.micro"
- }
resource resource块
"aws_instance" 资源类型,由provider决定有哪些资源类型
"web" 本地名称,仅用于在当前模块中引用此资源
{...} 参数,大多数参数取决于资源类型。系统也有元参数
- depends_on 用于指定隐藏的依赖项
- count 用于根据计数创建多个资源实例
- for_each 根据映射或字符串集创建多个实例
- provider 用于选择非默认提供程序配置
- lifecycle 用于生命周期自定义
- provisioner 用于在资源创建后采取额外的行动
data块可以根据provider提供的DATA SOURCE,填写对应的参数。搜索到相对应的基础设施的信息,然后data块可以作为数据源提供相关数据信息。
示例
resource中引用本地名称为"web"的data source的id。
data块中的各种参数只是为了找到对应的基础设施资源。
- data "aws_ami" "web" {
- filter {
- name = "state"
- values = ["available"]
- }
-
- filter {
- name = "tag:Component"
- values = ["web"]
- }
-
- most_recent = true
- }
- resource "aws_instance" "web" {
- ami = data.aws_ami.web.id
- instance_type = "t1.micro"
- }
variable块只能声明变量,并不能指定变量的值
- variable "image_id" {
- type = string
- description = "This is image id"
- default = "abcxxxx"
- }
支持参数
- default - 然后使变量可选的默认值。
- type - 此参数指定变量接受的值类型。
- description - 这指定输入变量的文档。
- validation - 定义验证规则的块,通常除了类型约束。
- sensitive - 在配置中使用变量时限制 Terraform UI 输出。
- nullable - 指定变量是否可以为空。
- resource "some_resource" "a" {
- name = var.image_id
- ...
- }
变量输入有多种方式
编辑xx.tfvars文件
image_id = "value"
命令行引用tfvars文件
terraform apply -var-file="xx.tfvars"
output就像函数的retrun返回值。执行完terraform apply之后输出的返回值。
示例
创建一个vpc,使用output输出vpc的id 和 执行成功状态提示。
- #配置阿里云provider
- provider "alicloud" {
- access_key = "your_ak_xxx"
- secret_key = "your_sk_xxx"
- region = "cn-shenzhen"
- }
-
- #创建阿里云vpc
- resource "alicloud_vpc" "liqi-vpc-test" {
- vpc_name = "liqi-vpc-test"
- cidr_block = "10.100.0.0/16"
- }
-
- output "apply_state" {
- value = "apply successful"
- }
-
- output "new_vpc_id" {
- value = "${alicloud_vpc.liqi-vpc-test.id}"
- }
执行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。