Как создать Terraform с оператором if, else, elsif? - PullRequest
1 голос
/ 07 апреля 2019

Я настраиваю модуль terraform для создания кластера сияний.
У меня должна быть опция для межрегиональной репликации, поэтому мне нужно выбрать регион реплики по отношению к исходной области.
Есть ли способ сделать множественный вариант условным в terraform?

Ответы [ 5 ]

1 голос
/ 07 апреля 2019

В Terraform нет такой вещи, как если бы / elseif / else <0,12 </p>

Однако вы можете использовать классическую логическую логику в Условия Terrafom

0 голосов
/ 18 апреля 2019

Это был самый полезный справочник, который я встречал в Интернете при реализации условных выражений в скриптах Terraform: https://blog.gruntwork.io/terraform-tips-tricks-loops-if-statements-and-gotchas-f739bbae55f9.

0 голосов
/ 17 апреля 2019

Вы можете попробовать просто использовать map и lookup.Пример:

/* In your variables.tf */
variable "region_mapping" {
  description = "mapping for cross-region replication"
  default = {
    "us-east-1" = "us-east-2",
    "us-west-1" = "us-west-2"
  }
}

/* Then create use lookup to get the replication region from the deployment region */
resource "example" "example" {
  region = "${lookup(var.region_mapping, var.region)}"
}

Если var.region - это место, где развернут ваш текущий кластер, и его значение, например, us-east-1, то поиск вернет us-east-2 в качестве региона, в котором вы должны развертывать свою реплику.,

Настройте это в соответствии со своими потребностями.

0 голосов
/ 07 апреля 2019

Это один из способов использования функции coalesce ():

locals{
  prod = "${var.environment == "PROD" ? "east" : ""}"
  prod2 = "${var.environment == "PROD2" ? "west2" : ""}"
  nonprod = "${var.environment != "PROD" && var.environment != "PROD2" ? "west" : ""}"
  region = "${coalesce(local.prod,local.prod2, local.nonprod)}"
}
0 голосов
/ 07 апреля 2019

Не думаю, что вам это действительно нужно.

В общем, есть переменные, которые вы можете вставить в качестве входных данных, и вы можете снабдить эти переменные значениями.Если вам нужна какая-то логика / принятие решений, лучше всего иметь в вашем CI / CD переменные пиплэйна (то есть регион и область источника) или выполнять какую-либо логику в скриптах перед запуском terraform.

Так что в моем случаеВ бамбуке у нас есть разные переменные в плане развертывания, и у каждого из них есть своя среда (dev-test-stag-prod) и регион (то есть us-east-1).Когда он выполняется, он устанавливает переменную terraform для данной среды и региона.

До этого у нас есть две учетные записи, одна - песочница, а другая - «производственная», но в «производственной» есть этот dev, test, stag, prod, так что тестирование и некоторая интеграция также тестируются там.Сначала мы просто используем песочницу, чтобы попробовать наше развертывание.Поскольку я не хочу настраивать доступ к AWS в каждой сборке, я использовал этот метод перед запуском terraform apply:

if [ "$PROD_BUILD" = "true" ]
then
  echo "PROD build is used, the PROD AWS tokens will be used"
  export TF_VAR_CERTIFICATE_DOMAIN=$PROD_TERRAFORM_CERTIFICATE_DOMAIN
  export AWS_ACCESS_KEY_ID=${PROD_AWS_ACCESS_KEY_ID}
  export AWS_SECRET_ACCESS_KEY=${PROD_AWS_SECRET_ACCESS_KEY}
  export S3_TERRAFORM_STATE_BUCKET=$PROD_S3_TERRAFORM_STATE_BUCKET
  export S3_TERRAFORM_STATE_REGION=$PROD_S3_TERRAFORM_STATE_REGION
else
  echo "DEV build is used, the DEV AWS tokens will be used"
  export TF_VAR_CERTIFICATE_DOMAIN=$DEV_TERRAFORM_CERTIFICATE_DOMAIN
  export AWS_ACCESS_KEY_ID=${DEV_AWS_ACCESS_KEY_ID}
  export AWS_SECRET_ACCESS_KEY=${DEV_AWS_SECRET_ACCESS_KEY}
  export S3_TERRAFORM_STATE_BUCKET=$DEV_S3_TERRAFORM_STATE_BUCKET
  export S3_TERRAFORM_STATE_REGION=$DEV_S3_TERRAFORM_STATE_REGION
fi
...