Terraform 变量的使用 (4)
  zNxK8cIqmu7p 2023年11月02日 39 0

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 = file("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



提交代码

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



5 数据源使用

在前面的操作实践中,仍然需要手动置顶安全组ID。事实上 Terraform 为我们提供了更好的处理方式。利用data_source 数据源,从云供应商抓起想要的数据信息。

下面使用数据源的方法获取安全组ID。


数据源声明

数据源使用 data {} 代码块进行声明

// 数据源
data "aws_security_groups" "default" {  // 数据源为"aws_security_groups",数据源名称"default"
  filter {                              // 过滤参数找出符合条件的安全组
    name = "group-name"                 // 过滤 group_name = default 的安全组
    values = ["default"]
  }
}


数据源调用

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 = data.aws_security_groups.default.ids[0]   // 调用数据源的信息,列表的第一个值
}



6 声明变量输出

数据源使用 output {} 代码块进行声明.


变量输出声明

新建一个 outputs.tf 文件来保存输出变量的内容。

$ cat oytputs.tf

output "DNS" {                          // 输出变量名称 "DNS"
  value = aws_instance.web.public_dns   // 返回给用户的结果。
  description = "AWS EC2 public DNS"    // 可选参数。描述信息
}

output "IP" {
  value = aws_instance.web.public_ip
  description = "AWS EC2 public IP"
  sensitive = true                      // 可选参数。敏感信息输出可以设为true
}


方法一:apply 查看变量输出

terraform apply 完成之后会显示输出变量的值。

$ terraform apply

...
  Enter a value: yes


Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

DNS = "ec2-35-92-34-143.us-west-2.compute.amazonaws.com"
IP = <sensitive>



方法二:output 子命令查看变量输出

需要apply之后才能查看。

$ terraform output     
DNS = "ec2-35-92-34-143.us-west-2.compute.amazonaws.com"
IP = "35.92.34.143"



方法三:output 子命令查看指定变量输出

$ terraform output IP
"35.92.34.143"


提交代码

git commit -am "using output variables"




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  zNxK8cIqmu7p   2023年11月02日   27   0   0 terraform
  zNxK8cIqmu7p   2023年11月02日   40   0   0 terraform
  zNxK8cIqmu7p   2023年11月02日   124   0   0 IaCterraform
  zNxK8cIqmu7p   2023年11月02日   27   0   0 tfenvIaCterraform
  zNxK8cIqmu7p   2023年11月13日   28   0   0 terraform
  zNxK8cIqmu7p   2023年11月02日   42   0   0 terraform
  zNxK8cIqmu7p   2023年11月13日   23   0   0 terraform
  zNxK8cIqmu7p   2023年11月13日   23   0   0 terraform