Проблемы с настройкой схемы PostgreSQL через Terraform Null Resource - PullRequest
0 голосов
/ 04 марта 2019

BLUF: мне нужно иметь возможность добавлять SCHEMA в экземпляр RDS БД PostgreSQL 10.4 через terraform полностью автоматизированным способом.

Я пытаюсь выполнить полностью автоматическую установку Private Terraform Enterprise (PTFE).Руководство по развертыванию требует PostgreSQL v9.4 или новее.Это развертывание на AWS, поэтому я решил развернуть PSQL через RDS.В настоящее время RDS имеет только версию 10.5.

У меня нет опыта работы с psql и ограниченный опыт работы с bash.Я попытался использовать «Null Resource» 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)

Как вы можете видеть выше, он показывает запрос пароля, который вы обычно видите при запуске команды.Время создания истекает.Я проверил командную строку вручную через экземпляр, на котором я запускаю команду, и она прошла успешно.Переменные, которые интерполируются, верны, и генерация пароля работает.Я думаю, что что-то не так с "local-exec", который не передает PGPASSWORD.

ОС: Ubuntu 18.04 PostreSQL: 10.4

Я открыт для любых идей, чтобы автоматизировать это с помощью terraform и работы.Заранее спасибо.

1 Ответ

0 голосов
/ 29 июля 2019

Лучший способ " автоматизировать работу через terraform и работать " - это использовать поставщика PostgreSQL .

. Вам нужно будет указать конфигурацию поставщика, например:поэтому (с использованием синтаксиса 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
}

ПРИМЕЧАНИЕ. Приведенное выше требование требует подготовки фактической базы данных, как указано здесь .В дополнение к 2 предлагаемым временным решениям, упомянутым в ссылке, если вы используете оболочку terraform, такую ​​как terragrunt, вы можете легко обойти это ограничение, разделив создание схемы в отдельном модуле и настроив зависимость модуля.

Toна самом деле создайте схему, требуемую TFE, которую вы делаете:

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

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

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

Мне просто нужно было сделать то же самое в Azure, и я успешно использовал эту комбинацию.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...