0
点赞
收藏
分享

微信扫一扫

Terraform 变量的使用(4)

静守幸福 2023-09-05 阅读 52

1 变量定义变量

Terraform 可以将变量的内容写到一个单独的文件中,是main文件引用此文件的定义的变量的值,便于使用阅读。

上接 Terraform 创建第一个云基础设施 (3) 创建云基础设施的Terraform文件的基础上进行修改。

$ cat variables.tf

variable "region" {             //  变量名 region,不可用重复。花括号里面是参数
  type = string                 //  输入变量的类型
  default = "us-west-2"         //  变量的默认值
  description = "AWS region"    //  变量的描述
}

variable "amis" {
  type = map
  default = {
    us-west-2 = "ami-002829755fa238bfa"
  }
  description = "AWS ID"
}

variable "instance_type" {
  type = string
  default = "t2.micro"
  description = "EC2 instance type"
}

variable "public_key" {
  type = string
  default = "id_rsa.pub"
  description = "SSH public key"
}

variable "security_group" {
  type = string
  description = "security group ID"
}


2 变量引用方法

引用变量

引用变量,只需要在变量名前面加上 var. 即可引用自定义的变量。

如引用 region 的变量:

provider "aws" {
  region = "us-west-2"  # 原始的写法
}


provider "aws" {
  region = var.region  	# 引用变量
}


内置函数

其他内置函数,查询官方文档。

lookup:允许从map中获取值.

# 变量定义
variable "amis" {
  type = map
  default = {
    us-west-2 = "ami-002829755fa238bfa"
  }
  description = "AWS ID"
}

# 变量引用
resource "aws_instance" "web" {  
    ami = lookup(var.amis, var.region)    # var.region = "us-west-2",ami的值对应变量中的 "ami-002829755fa238bfa"
		...
}



file:读取给定文件的内容,并返回字符串。

# 变量定义
variable "public_key" {
  type = string
  default = "id_rsa.pub"
  description = "SSH public key"
}

# 变量引用
resource "aws_key_pair" "ssh" {
  key_name = "admin"
  public_key = file(var.public_key)  # 会读取 "id_rsa.pub" 文件中的值,需要在当前目录下创建此文件。
}




3 设置输入变量

执行 plan 或者 apply 的时候,如果没有给变量设置默认值,就会提示我们输入变量的内容。

# 变量定义
variable "security_group" {						# 没有设置默认值
  type = string
  description = "security group ID"
}


# 变量引用
resource "aws_security_group_rule" "ssh" {
  type = "ingress"
  from_port = 22
  to_port = 22
  protocol = "tcp"
  cidr_blocks = ["0.0.0.0/0"]
  security_group_id = var.security_group		# 变量引用
}


方法一:手动输入变量

% terraform plan
var.security_group
  security group ID

  Enter a value:  sg-572b3b6c  # 手动输入防火墙id 才会继续执行。



方法二:命令行输入变量

terraform plan -var security_group=sg-572b3b6c



方法三:通过文件传递变量

cat > terraform.tfvars << EOF
security_group = "sg-572b3b6c"
EOF

如果变量定义文件名不是 terraform.tfvars 可以使用 -var-file 来指定文件名。



方法四:通过环境变量的方式

环境变量必须使用 TF_VAR_ 开头。

export TF_VAR_security_group=sg-572b3b6c



4 使用变量创建基础设施

改动如下:

# 创建密钥文件
cp ~/.ssh/id_rsa.pub .

# 创建安装 nginx 脚本文件
cat > setup_nginx.sh << EOF
#!/bin/bash
sudo yum install -y nginx
sudo nginx
EOF


# main文件新增user_data
resource "aws_instance" "web" {  
    ami = lookup(var.amis, var.region)
    instance_type = var.instance_type
    key_name = aws_key_pair.ssh.key_name
    user_data = "setup_nginx.sh"  	# 创建 EC2 实例后,调用执行 "setup_nginx.sh" 脚本
    tags = {    										# 将EC2 实例命名为 "nginx-web-server"
      Name = "nginx-web-server"
    }
}

# main文件防火墙新增80端口
resource "aws_security_group_rule" "web" {
  type = "ingress"
  from_port = 80
  to_port = 80
  protocol = "tcp"
  cidr_blocks = ["0.0.0.0/0"]
  security_group_id = var.security_group
}


更新基础设施

terraform plan
terraform apply

nginx 已经安装了,说明shell脚本已经执行了。但是nginx服务没有启动,这里后续再解决。


提交代码

echo id_rsa.pub >> .gitignore 
echo terraform.tfvars >> .gitignore 
git add .
git commit -m "using variables"




举报

相关推荐

0 条评论