Terraform JSON Ошибка при использовании for_each внутри ресурса внутри файла json - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь использовать новый for_each внутри ресурса в файле .tf.json

Цель состоит в том, чтобы иметь возможность передать карту сотрудников и сгенерировать gsuite_user для каждого из них программно,без необходимости повторной декларации каждого ресурса (также потому, что модули еще не могут быть зациклены)

{
  "resource": {
    "gsuite_user": {
      "for_each": "${var.employee_map}",
      "employee": {
        "change_password_next_login": true,
        "name": {
          "family_name": "${each.value.last_name}",
          "given_name": "${each.value.first_name}"
        },
        "password": "password",
        "primary_email" :"${var.first_name}.${var.last_name}@email",
        "lifecycle": {
          "ignore_changes": ["password", "change_password_next_login"]
        }
      }
    }
}

Я получаю следующую ошибку:

Error: Incorrect JSON value type

  on ../modules/employees/main.tf.json line 4, in resource.gsuite_user:
   4:       "for_each": "${var.employee_map}",


Either a JSON object or a JSON array is required, representing the contents of
one or more "resource" blocks.

Мой файл переменной

{
  "employee_map": {
    "john.doe": {
      "first_name": "john",
      "last_name": "doe"
    },
    "jane.doey": {
      "first_name": "jane",
      "last_name": "doey"
    }
  }
}

1 Ответ

0 голосов
/ 31 октября 2019

Эта ошибка появляется, потому что в объявлении ресурса отсутствует уровень вложенности.

В качестве примера используется следующее объявление собственного синтаксиса:

resource "gsuite_user" "employee" {
  for_each = var.employee_map

  change_password_next_login = true
  # etc, etc
}

Обратите внимание, что в приведенном вышеАргумент for_each находится внутри блока resource вместе с аргументом change_password_next_login и всеми последующими. Чтобы имитировать это в JSON, аналогично, свойство "for_each" должно находиться внутри объекта JSON, представляющего этот блок:

{
  "resource": {
    "gsuite_user": {
      "employee": {
        "for_each": "${var.employee_map}",
        "change_password_next_login": true,
        "name": {
          "family_name": "${each.value.last_name}",
          "given_name": "${each.value.first_name}"
        },
        "password": "password",
        "primary_email" :"${var.first_name}.${var.last_name}@email",
        "lifecycle": {
          "ignore_changes": ["password", "change_password_next_login"]
        }
      }
    }
  }
}

Если вы поместите for_each непосредственно в объект gsuite_user, тогда декодер JSON предполагаетВы пытались объявить блок resource "gsuite_user" "for_each" и, таким образом, пытаетесь интерпретировать "${var.employee_map}" как тело этого блока. Это недопустимо, потому что тело блока всегда должно быть представлено как объект JSON. (Это также может быть массив, в этом случае он будет объявлять один или несколько блоков, но в этом сценарии это не имеет смысла, поскольку метки блоков ресурсов должны быть уникальными внутри модуля.)

...