我有一个简单的脚本,该脚本应该返回数据库的连接字符串,然后将其用作Postgres提供程序的输入参数。
我正在使用一个小的bash脚本从AWS Secrets Manager中读取凭证。该脚本可以工作并以适当的格式返回JSON。
我第一次测试脚本时,它就起作用了!好吧,不完全是-用户名错误。我修复了脚本以返回正确的用户名,但是terraform继续使用旧的用户名
地形计划:
provider "postgresql" {
alias = "db_admin"
host = "${data.external.root_password.result.host}"
sslmode = "disable"
port = 5432
database = "postgres"
username = "${data.external.root_password.result.username}"
password = "${data.external.root_password.result.password}"
}
data "external" "root_password" {
program = ["bash", "${path.module}/get_root_password.sh"]
query = {
secret_name = "${var.root_password_name}"
assume_role = "${terraform.workspace}"
}
}
还有bash脚本:
#!/bin/bash
set -e
# This is a simplified version of the script for debugging purposes
# The first version had username = martin, but then got changed to root
echo {\"password\": \"not_the_password\", \"host\": \"some_db\", \"username\": \"root\"}
terraform的输出如下(请注意,用户名是马丁而不是root):
Error: Error refreshing state: 1 error(s) occurred:
* module.db_roles.provider.postgresql.db_admin: Error initializing PostgreSQL client: error detecting capabilities: error PostgreSQL version: pq: password authentication failed for user "martin"
旧值必须存储在某个地方...但是我尝试到处寻找,没有运气。我注意到的另一件事是,该计划似乎是在运行外部数据之前初始化postgres提供程序。可能是这样吗?它仍然无法回答旧值从何而来!