通过Terraform Null资源配置PostgreSQL模式的问题

时间:2019-03-04 04:34:14

标签: postgresql terraform terraform-provider-aws

BLUF:我需要能够以完全自动化的方式通过terraform将SCHEMA添加到PostgreSQL 10.4 RDS数据库实例。

我正在尝试完全自动化安装Private Terraform Enterprise(PTFE)。部署指南要求使用PostgreSQL v9.4或更高版本。该部署在AWS上,因此我选择通过RDS部署psql。 RDS目前仅具有10.5版本。

我对psql没有经验,对bash的经验也很有限。我试图使用terraform的“空资源”并运行本地配置程序来执行一些命令。见下文:

resource "null_resource" "db_setup" {
  depends_on = ["aws_db_instance.pes", "aws_security_group.db_main", "random_pet.db-pwd"]

    provisioner "local-exec" {
      command = <<-EOF
       ssh -i '~/example.pem' ubuntu@${var.ec2_instance}
       sudo apt-get -y install postgresql 
       psql --host=${aws_db_instance.pes.address} --port=5432 --username=example_username --dbname=example_name -c 'CREATE SCHEMA rails;' -c 'CREATE SCHEMA vault;' -c 'CREATE SCHEMA registry;' 
       EOF

      environment {
        PGPASSWORD = "${random_pet.db-pwd.id}"
      }
    }
}

当我在“ terraform apply”中运行此数据库和所有其他资源时,它们会正确构建。当terraform去执行空资源“ db-setup”时,它似乎没有在提示时通过密码,并且还得到一个“不会分配伪终端,因为stdin不是终端。”

module.pes.null_resource.db_setup: Creating...
module.pes.null_resource.db_setup: Provisioning with 'local-exec'...
module.pes.null_resource.db_setup (local-exec): Executing: ["/bin/sh" "-c" "ssh -i '~/example.pem' ubuntu@<redacted>\nsudo apt-get -y install postgresql \npsql --host=<redacted> --port=5432 --username=example_username --dbname=example_name -c 'CREATE SCHEMA rails;' -c 'CREATE SCHEMA vault;' -c 'CREATE SCHEMA registry;' \n"]
module.pes.null_resource.db_setup (local-exec): Pseudo-terminal will not be allocated because stdin is not a terminal.
module.pes.null_resource.db_setup (local-exec): Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-1032-aws x86_64)

module.pes.null_resource.db_setup (local-exec):  * Documentation:  https://help.ubuntu.com
module.pes.null_resource.db_setup (local-exec):  * Management:     https://landscape.canonical.com
module.pes.null_resource.db_setup (local-exec):  * Support:        https://ubuntu.com/advantage
......

Password:module.pes.null_resource.db_setup: Still creating... (10s elapsed)

如上所述,它显示了运行命令时通常会看到的密码提示。创建最终将超时。我已经通过在其上运行命令的实例手动测试了命令字符串,并且该命令成功。我正在插值的变量是正确的,并且密码生成有效。我认为“本地执行程序”未通过PGPASSWORD时出现了问题。

操作系统:Ubuntu 18.04 PostreSQL:10.4

我乐于接受任何想法,以通过terraform和工作使其自动化。预先感谢。

1 个答案:

答案 0 :(得分:1)

通过地形和工作实现自动化”的最佳方法是利用PostgreSQL provider

您将需要这样指定提供者配置(使用0.12语法):

provider "postgresql" {
  host             = var.pg_server.fqdn
  database         = var.pg_db.name
  username         = "${var.pg_admin}@${var.pg_server.name}"
  password         = var.pg_password
  sslmode          = "require"
  connect_timeout  = 15
  expected_version = var.pg_version
}

注意:以上要求按照here的要求提供实际的数据库。除了链接中提到的2个建议的解决方法外,如果使用terragrunt之类的terraform包装器,则可以通过将模式创建拆分到一个单独的模块中并配置模块依赖项来轻松解决此限制。

要实际创建TFE所需的架构,请执行以下操作:

resource "postgresql_schema" "rails" {
  name = "rails"
}

resource "postgresql_schema" "vault" {
  name = "vault"
}

resource "postgresql_schema" "registry" {
  name = "registry"
}

我只需要在Azure中做同样的事情,就可以成功地使用这种组合。

希望有帮助。