Как вывести атрибуты созданных ресурсов? - PullRequest
2 голосов
/ 31 мая 2019

Я выполняю модуль GCP для создания учетной записи службы.

main.tf:

resource "google_service_account" "gsvc_account" {
    account_id   = "xxx"
    display_name = ""
    project      = "proj-yyy"
}

output "account_id" {
    value = "${google_service_account.gsvc_account.account_id}"
}

После создания учетной записи создается файл terraform.tfstate, содержащий все данные учетной записи.

terraform.tfstate

{
    "version": 4,
    "terraform_version": "0.12.0",
    "serial": 3,
    "lineage": "aaaa-bbbb-cccc",
    "outputs": {
        "xxx": {
            "value": "xxx",
            "type": "string"
        }
    },
    "resources": [
      {
            "module": "module.gsvc_tf",
            "mode": "managed",
            "type": "google_service_account",
            "name": "gsvc_account",
            "provider": "provider.google",
            "instances": [
                {
                    "schema_version": 0,
                    "attributes": {
                        "account_id": "xxx",
                        "display_name": "",
                        "email": "xxx@yyy.com",
                        "id": "projects/proj-yyy/serviceAccounts/xxx@yyy.com",
                        "name": "projects/proj-yyy/serviceAccounts/xxx@yyy.com",
                        "policy_data": null,
                        "project": "proj-xxx",
                        "unique_id": "10891885"
                    }
                }
            ]
        }
    ]
}

Как вы можете видеть выше, в модуле я выводю входную переменную account_id. Есть ли способ вывести attributes, а именно. id, name и т. Д., Чтобы к ним мог получить доступ другой модуль? attributes вычисляются после создания ресурса.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Если ваш другой модуль работает с другим файлом состояния (например, ваш код Terraform находится в отдельном каталоге), то вам может быть лучше использовать google_service_account источник данных вместо того, чтобы пытаться вывестизначения ресурса в файл состояния и использование источника данных terraform_remote_state для их извлечения.

В документации для источника данных google_service_account приведен хороший пример как бы вы это использовали:

data "google_service_account" "myaccount" {
  account_id = "myaccount-id"
}

resource "google_service_account_key" "mykey" {
  service_account_id = "${data.google_service_account.myaccount.name}"
}

resource "kubernetes_secret" "google-application-credentials" {
  metadata = {
    name = "google-application-credentials"
  }
  data {
    credentials.json = "${base64decode(google_service_account_key.mykey.private_key)}"
  }
}

Это избавляет от необходимости настраивать ваш удаленный источник данных состояния и может быть значительно проще.Фактически, именно таким образом я бы рекомендовал доступ к информации о существующем ресурсе в любом случае, когда у провайдера есть подходящий источник данных.Я бы даже зашел так далеко, что рекомендовал бы external источник данных вместо terraform_remote_state источника данных, если есть другой способ получить эту информацию (например, через CLI облачных провайдеров) только потому, что terraform_remote_state источник данных особенно неуклюж.

1 голос
/ 31 мая 2019

Из документов для google_service_account ресурса:

экспортируются следующие вычисленные атрибуты:

email - адрес электронной почты учетной записи службы. На это значение следует ссылаться из любых источников данных google_iam_policy, которые предоставляют привилегии учетной записи службы.

name - полное имя учетной записи службы.

unique_id - уникальный идентификатор учетной записи службы.

Вы можете объявить выходные данные, используя эти атрибуты так же, как вы объявили свой account_id вывод. Например:

   output "id" {
     value = "${google_service_account.gsvc_account.unique_id}"
   }

   output "email" {
     value = "${google_service_account.gsvc_account.email}"
   }

В связи с этим: «чтобы к ним мог получить доступ другой модуль» ... если «другой модуль» использует тот же файл состояния, то вышеприведенные выходы адресуются с помощью ...

  • ${google_service_account.gsvc_account.account_id}
  • ${google_service_account.gsvc_account.email}
  • и т. Д.

... то есть вам вообще не нужны выходы. Итак, я предполагаю, что «другой модуль» находится в отдельном проекте / рабочей области / репо и, следовательно, использует другой файл состояния. Если это так, то вы получите доступ к этим выходам через дистанционное состояние . Например, вы должны объявить удаленный источник данных состояния, чтобы он указывал на любое состояние, содержащее ваши выходные данные:

resource "terraform_remote_state" "the_other_state" {
  backend = "..."
  config {
    ...
  }
}


А затем обратитесь к выходам в этом состоянии следующим образом:

  • ${terraform_remote_state.the_other_state.output.account_id}
  • ${terraform_remote_state.the_other_state.output.email}
  • и т.д.
...