我有一个非常简单的用户数据脚本:
#!/bin/bash
# Create script that will be executed as cron
cat > generate_rds_password.sh <<EOF
export AWS_DEFAULT_REGION=${region}
echo "Generating password"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname ${rds_host} --port 5432 --region ${region} --username ${pgusername})"
echo "$${PGPASSWORD}"
EOF
# Make it executable
chmod +x generate_rds_password.sh
这样做的目的是创建一个脚本,并使其可执行。它做了一些其他的事情,但与这个问题无关。
我调用Terraform:生成这个脚本的方式
resource "aws_launch_template" "rds_bastion" {
<...>
user_data = base64encode(templatefile("${path.module}/bastion_userdata/startup.sh", {
rds_host = data.aws_db_instance.rds_instance[count.index].address
pgusername = var.pgmonitor_user
region = var.region
environment = var.environment
}))
}
现在,由于某些原因,我无法响应$PGPASSWORD
。TF计划向我显示了正确的命令(echo "${PGPASSWORD}"
(,但当我从实例中抓取文件时,尽管PGPASSWORD
是正确生成的,但回波是空的:
export PGPASSWORD="xxxx.asdsadsad.eu-central-1.rds.amazonaws.com:5432/?Action=connect&DBUser=asdasd&X-Amz-Algorithm=...."
echo ""
我在这里错过了什么?从这个线索来看,这似乎是正确的方式?
因此,在阅读了这篇博客文章后,如果从脚本创建脚本,变量的转义方式似乎有所不同。
对我有效的是$
和$$
的组合
cat > generate_rds_password.sh <<EOF
export AWS_DEFAULT_REGION=${region}
echo "Generating password"
TF_PGPASSWORD="$(aws rds generate-db-auth-token --hostname ${rds_host} --port 5432 --region ${region} --username ${pgusername})"
echo $${TF_PGPASSWORD}
EOF