Terraform:将属性文件保存到env部分

时间:2019-07-31 09:34:56

标签: terraform

我有一个.properties,我想应用一个模板来为我的部署生成env {}条目。

类似这样的东西:

          {{- range $key, $value := .Values.configurationOverrides }}
         env {
            name  = {{ printf "REST_%s" $key | replace "." "_" | upper | quote }}
            value = 

生成env {}个条目:

  ...
  spec {
    container {
      image = "**"
      name  = "rest"

      env {
        name  = "REST_FROM_PROPERTIES_FILE"
        value = "VALUE FROM PROPERTIES FILE"
      }
      ...

有可能吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

注意:我假设您使用Terraform 0.12.x

解决方案的一部分是dynamic blocks,它允许您遍历值列表并动态添加env节:

properties_list = [{ name: "MY_ENV_VAR", value: "VALUE", },]
dynamic "env" {
  for_each = var.properties_list
  name = env.value.name
  value = env.value.value
}

最困难的部分是解析属性文件,因为Terraform中没有开箱即用的方法。您可以使用类似jsondecode之类的东西将JSON解码为Terraform对象。因此,您可以先将属性文件转换为JSON文件(例如,使用this npm package),然后将其解码为terraform对象。

答案 1 :(得分:0)

Blokje5 的帮助下,我设法使用变量。它不是真正从属性文件中加载,但它满足了我的需要(当需要更改config / env vars时,它不会更改Terraform代码):

terraterra.tfvars文件:

kafka-rest-envs = {
  KAFKA_REST_BOOTSTRAP_SERVERS                            = "localhost:9092"
  KAFKA_REST_HOST_NAME                                    = "hostnamey"
  KAFKA_REST_ID                                           = "kafka-rest"
  KAFKA_REST_LISTENERS                                    = "http://0.0.0.0:8082"
  KAFKA_REST_CLIENT_SASL_JAAS_CONFIG                      = "***"
  KAFKA_REST_CLIENT_SECURITY_PROTOCOL                     = "SASL_SSL"
  KAFKA_REST_CLIENT_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM = "https"
  KAFKA_REST_CONSUMER_RETRY_BACKOFF_MS                    = "500"
  KAFKA_REST_CONSUMER_REQUEST_TIMEOUT_MS                  = "25000"
  KAFKA_REST_PRODUCER_ACKS                                = "1"
  KAFKA_REST_CLIENT_SASL_MECHANISM                        = "PLAIN"
  KAFKA_REST_ADMIN_REQUEST_TIMEOUT_MS                     = "50000"
  KAFKA_REST_KEY_SERIALIZER                               = "io.confluent.kafka.serializers.KafkaAvroSerializer"
  KAFKA_REST_VALUE_SERIALIZER                             = "io.confluent.kafka.serializers.KafkaAvroSerializer"

}

和地形:

...
      spec {
        container {
          image = "confluentinc/cp-kafka-rest"
          name  = "kafka-rest"

          dynamic "env" {
            for_each = var.kafka-rest-envs
            content {
              name  = env.key
              value = env.value
            }
          }
...

谢谢!