Terraform外部数据源作为提供者的输入

时间:2019-01-17 19:02:25

标签: terraform

我有一个简单的脚本,该脚本应该返回数据库的连接字符串,然后将其用作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提供程序。可能是这样吗?它仍然无法回答旧值从何而来!

0 个答案:

没有答案