Terraform:如何将变量传递给 user_data 初始化脚本

Posted

技术标签:

【中文标题】Terraform:如何将变量传递给 user_data 初始化脚本【英文标题】:Terraform: How can I pass variables to user_data init script 【发布时间】:2022-01-12 13:59:12 【问题描述】:

我已经在这个问题上徘徊了一段时间,但我无法解决它。

我正在启动一个运行 bash 脚本并安装一些东西的 EC2 实例。 同时,我也在启动一个 RDS 实例,但我需要能够将值从 RDS 端点传递到 EC2 实例以配置连接。

我正在尝试使用模板文件来做到这一点,就像这样

resource "aws_rds_cluster_instance" "cluster_instances" 
  count               = 1
  identifier          = "rds-prod-ddbb-$count.index"
  cluster_identifier  = aws_rds_cluster.default.id
  instance_class      = "db.r5.large"
  engine              = "aurora"
  engine_version      = "5.6.mysql_aurora.1.22.5"
  publicly_accessible = "true"


resource "aws_rds_cluster" "default" 
  cluster_identifier      = "aws-rds-ddbb-cluster"
  availability_zones      = ["us-west-2b"]
  db_subnet_group_name    = "default-vpc-003d3ab296c"
  skip_final_snapshot     = "true"
  backup_retention_period = 30
  vpc_security_group_ids  = [aws_security_group.ddbb.id]


data "template_file" "RDSs" 
  template = file("init.sh")
  vars = 
    rds = aws_rds_cluster.default.endpoint
  
  depends_on = [
    aws_rds_cluster.default,
    aws_rds_cluster_instance.cluster_instances,
  ]


resource "aws_instance" "web_01" 
  ami                    = "ami-0477c9562acb09"
  instance_type          = "t2.micro"
  subnet_id              = "subnet-0d0558d99ec3cd3"
  key_name               = "web-01"
  user_data_base64       = base64encode(data.template_file.RDSs.rendered)
  vpc_security_group_ids = [aws_security_group.ddbb.id]
  ebs_block_device 
    device_name = "/dev/sda1"
    volume_type = "gp2"
    volume_size = 20
  
  tags = 
    Name = "Web01"
  
  depends_on = [
    aws_rds_cluster.default,
    aws_rds_cluster_instance.cluster_instances,
  ]

然后,我的init.sh是这样的:

#!/bin/bash
echo "rds = $rds" > /var/tmp/rds

但是我在/var/tmp/rds 中什么也没有,所以看起来变量$rds 是空的。

您的帮助将不胜感激。

Ps:我的输出配置如下:

outputs.tf

output "rds_endpoint" 
  value = aws_rds_cluster.default.endpoint

这很好用,当应用完成时,它会显示 rds 端点的值。

【问题讨论】:

【参考方案1】:

该变量不是 shell 变量,而是模板变量——因此 terraform 将解析文件,无论其类型如何,并替换所述文件中的 terraform 变量。

知道这一点,$rds 不是 terraform 变量插值,while $rds is。

所以,你的 bash 脚本应该是:

#!/bin/bash
echo "rds = $rds" > /var/tmp/rds

【讨论】:

太棒了,太棒了!!!这就是我需要的,它工作完美!感谢您的宝贵时间。 另外值得一看的是云观察日志和渲染脚本本身:脚本:/var/lib/cloud/instance/scripts/(通常称为 part_xxx.sh)日志:/var/log/cloud-init-output.log 也许这会帮助你调试:)

以上是关于Terraform:如何将变量传递给 user_data 初始化脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Terraform 变量中连接 S3 存储桶名称并将其传递给主 tf 文件

Terraform - 无法将字符串变量传递给子模块

将变量传递给 terraform 动态块 v12

如何将数据源从一个模块引用到另一个模块并将其作为变量传递给根模块?

如何使用 Terraform 将 GKE 凭证传递给 Kubernetes 提供者?

如何使用 terraform 将 aws ec2 私有 ips 传递给模板文件