INTEGRITY Dokumentace

Import prostředků Cloudflare

Důležité je pochopit, že Terraform dokáže spravovat pouze konfiguraci, kterou sám vytvořil, nebo o které byl dodatečně výslovně informován. Toto omezení vyplývá z toho, že Terraform očekává, že bude pro spravované prostředky autoritativním zdrojem pravdy. K určení, jaké prostředky spravuje a v jakém jsou stavu, využívá dva typy souborů. O tom, kdy a jak provést změny, Terraform rozhoduje na základě následujícího:

Když Terraform volá rozhraní API Cloudflare za účelem vytvoření nových prostředků, jak je popsáno v návod, uloží tato ID do stavového souboru. Terraform ve výchozím nastavení používá terraform.tfstate soubor ve vašem adresáři, může to však být i vzdálené umístění ↗. Tato ID se později vyhledávají a aktualizují při volání terraform plan a terraform apply.

Pokud jste Cloudflare nakonfigurovali jiným způsobem, například přihlášením do Cloudflare dashboard nebo prostřednictvím curl volání na api.cloudflare.com, Terraform tato ID prostředků ve stavovém souboru ještě nemá. Chcete-li tuto stávající konfiguraci spravovat, musíte ji nejprve reprodukovat ve svém konfiguračním souboru a poté prostředky naimportovat jednotlivě, přičemž zadáte jejich ID a názvy prostředků.

cf-terraforming

cf-terraforming ↗ pomáhá stávajícím zákazníkům Cloudflare začít pracovat s Terraformem. V současné době cf-terraforming pomáhá vygenerovat stav konfigurace Terraformu tím, že načte všechny prostředky zadaného typu z vybraného účtu nebo zóny.

Instalace

Než začnete, musíte nainstalovat cf-terraforming.

Pokud na macOS používáte Homebrew, otevřete terminál a spusťte následující příkazy:

brew tap cloudflare/cloudflare
brew install cloudflare/cloudflare/cf-terraforming

Pokud používáte jiný operační systém, stáhněte si nejnovější verzi ↗ z cf-terraforming repozitáři GitHub.

Chcete-li zobrazit soubor nápovědy, spusťte cf-terraforming nebo cf-terraforming -h.

Základní použití

Chcete-li použít cf-terraforming, uveďte následující položky:

  1. Příkaz, který se má spustit (například generate nebo import).
  2. Váš e-mail uživatele Cloudflare: --email nebo -e.
  3. Váš API token Cloudflare: --token nebo -t.
  4. Účet a/nebo zóna, ze které se mají čerpat prostředky - --account/--zone nebo -a/-z.
  5. Prostředky Cloudflare, pro které se má vygenerovat konfigurace.

Seznam podporovaných prostředků najdete v Terraform README ↗.

Import existujících prostředků Cloudflare

Chcete-li začít spravovat stávající prostředky Cloudflare v Terraformu, například záznamy DNS, potřebujete:

Vygenerujte konfiguraci Terraformu pomocí cf-terraforming

Pokud nemáte definovaný konfigurační soubor Terraformu, potřebujete provider blok definovaný takto:

provider 'cloudflare' {
 # Cloudflare email saved in $CLOUDFLARE_EMAIL
 # Cloudflare API token saved in $CLOUDFLARE_API_TOKEN
}

Nezapomeňte uchovávat přihlašovací údaje v proměnných prostředí nebo v souborech terraform autovars, které nejsou zahrnuty do vašich zdrojových souborů.

Začněte voláním na cf-terraforming generate a vygenerujte konfiguraci Terraformu pro záznamy DNS v zóně, kterou chcete spravovat pomocí Terraformu.

cf-terraforming generate --email $CLOUDFLARE_EMAIL --token $CLOUDFLARE_API_TOKEN -z 1109d899a5ff5fd74bc01e581693685b --resource-type cloudflare_record > importing-example.tf

Pokud jste výstup nepřesměrovali do importing-example.tf souboru by výsledek zobrazený ve standardním výstupu (v okně terminálu) vypadal takto:

resource "cloudflare_record" "terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31" {
    name    = "@"
    type    = "A"
    ttl     = 1
    proxied = true
    value   = "192.0.2.1"
    zone_id = "1109d899a5ff5fd74bc01e581693685b"
}

resource "cloudflare_record" "terraform_managed_resource_5e10399a590a45279f09aa8fb1163354" {
    name    = "www"
    type    = "CNAME"
    ttl     = 1
    proxied = true
    value   = "mitigateddos.net"
    zone_id = "1109d899a5ff5fd74bc01e581693685b"
}

resource "cloudflare_record" "terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248" {
    name    = "a123"
    type    = "NS"
    ttl     = 300
    proxied = false
    value   = "rafe.ns.cloudflare.com"
    zone_id = "1109d899a5ff5fd74bc01e581693685b"
}

resource "cloudflare_record" "terraform_managed_resource_5799bb01054843eea726758f935d2aa2" {
    name    = "a123"
    type    = "NS"
    ttl     = 300
    proxied = false
    value   = "terin.ns.cloudflare.com"
    zone_id = "1109d899a5ff5fd74bc01e581693685b"
}

Volání terraform plan se v tuto chvíli pokusí tyto prostředky vytvořit, jako by neexistovaly, protože v souboru místního stavu chybí:

terraform plan
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 will be created
  + resource "cloudflare_record" "terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31" {
      + id          = (known after apply)>
      + created_on  = (known after apply)
      + domain      = "mitigateddos.net"
      + hostname    = (known after apply)
      + metadata    = (known after apply)
      + modified_on = (known after apply)
      + name        = "mitigateddos.net"
      + proxiable   = (known after apply)
      + proxied     = true
      + ttl         = 1
      + type        = "A"
      + value       = "192.0.2.1"
      + zone_id     = "1109d899a5ff5fd74bc01e581693685b"
    }

  # cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354 will be created
  + resource "cloudflare_record" "terraform_managed_resource_5e10399a590a45279f09aa8fb1163354" {
      + id          = (known after apply)
      + created_on  = (known after apply)
      + domain      = "mitigateddos.net"
      + hostname    = (known after apply)
      + metadata    = (known after apply)
      + modified_on = (known after apply)
      + name        = "www.mitigateddos.net"
      + proxiable   = (known after apply)
      + proxied     = true
      + ttl         = 1
      + type        = "CNAME"
      + value       = "mitigateddos.net"
      + zone_id     = "1109d899a5ff5fd74bc01e581693685b"
    }

  # cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248 will be created
  + resource "cloudflare_record" "terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248" {
      + id          = (known after apply)
      + created_on  = (known after apply)
      + domain      = "mitigateddos.net"
      + hostname    = (known after apply)
      + metadata    = (known after apply)
      + modified_on = (known after apply)
      + name        = "a123.mitigateddos.net"
      + proxiable   = (known after apply)
      + proxied     = false
      + ttl         = 300
      + type        = "NS"
      + value       = "rafe.ns.cloudflare.com"
      + zone_id     = "1109d899a5ff5fd74bc01e581693685b"
    }

  # cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2 will be created
  + resource "cloudflare_record" "terraform_managed_resource_5799bb01054843eea726758f935d2aa2" {
      + id          = (known after apply)
      + created_on  = (known after apply)
      + domain      = "mitigateddos.net"
      + hostname    = (known after apply)
      + metadata    = (known after apply)
      + modified_on = (known after apply)
      + name        = "a123.mitigateddos.net"
      + proxiable   = (known after apply)
      + proxied     = false
      + ttl         = 300
      + type        = "NS"
      + value       = "terin.ns.cloudflare.com"
      + zone_id     = "1109d899a5ff5fd74bc01e581693685b"
    }

Plan: 4 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.

Chcete-li to opravit, musíte skutečný stav těchto prostředků importovat z Cloudflare do stavového souboru Terraformu (.tfstate).

Import prostředků do stavu Terraformu

cf-terraforming umožňuje importovat místní stav (.tfstate soubor) pro stejné prostředky, které jste importovali během konfigurace.

Když spustíte cf-terraforming import ..., získáte seznam terraform import ... příkazy, které musíte poté spustit ručně, abyste tyto prostředky naimportovali do stavu Terraformu. V současné době jde o ruční proces, v budoucnu však může být automatizován.

  1. Spusťte následující příkaz:

    cf-terraforming import --resource-type "cloudflare_record" --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_API_KEY --zone $CLOUDFLARE_ZONE_ID
  2. Zkopírujte každý terraform import ... příkaz uvedený ve výstupu a spusťte ho. Terraform naimportuje každý prostředek jednotlivě do stavu Terraformu.

Pokud je například výstup prvního příkazu (cf-terraforming import ...) obsahoval následující terraform příkazy:

terraform import cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 1109d899a5ff5fd74bc01e581693685b/3c0b456bc2aa443089c5f40f45f51b31
terraform import cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354 1109d899a5ff5fd74bc01e581693685b/d09d916d059aa9fc8cb54bdd49deea5f
terraform import cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248 1109d899a5ff5fd74bc01e581693685b/8d6ec0d02c5b22212ff673782c816ef8
terraform import cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2 1109d899a5ff5fd74bc01e581693685b/3766b952a2dda4c47e71952aeef33c77

Jednotlivé příkazy byste spouštěli v terminálu samostatně:

terraform import cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 1109d899a5ff5fd74bc01e581693685b/3c0b456bc2aa443089c5f40f45f51b31
cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31: Importing from ID "1109d899a5ff5fd74bc01e581693685b/3c0b456bc2aa443089c5f40f45f51b31"...
cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31: Import complete!
  Imported cloudflare_record [id=3c0b456bc2aa443089c5f40f45f51b31]
cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31: Refreshing state... [id=3c0b456bc2aa443089c5f40f45f51b31]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
terraform import cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354 1109d899a5ff5fd74bc01e581693685b/d09d916d059aa9fc8cb54bdd49deea5f
cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354: Importing from ID "1109d899a5ff5fd74bc01e581693685b/d09d916d059aa9fc8cb54bdd49deea5f"...
cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354: Import complete!
  Imported cloudflare_record [id=d09d916d059aa9fc8cb54bdd49deea5f]
cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354: Refreshing state... [id=d09d916d059aa9fc8cb54bdd49deea5f]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
terraform import cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248 1109d899a5ff5fd74bc01e581693685b/8d6ec0d02c5b22212ff673782c816ef8
cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248: Importing from ID "1109d899a5ff5fd74bc01e581693685b/8d6ec0d02c5b22212ff673782c816ef8"...
cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248: Import complete!
  Imported cloudflare_record [id=8d6ec0d02c5b22212ff673782c816ef8]
cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248: Refreshing state... [id=8d6ec0d02c5b22212ff673782c816ef8]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
terraform import cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2 1109d899a5ff5fd74bc01e581693685b/3766b952a2dda4c47e71952aeef33c77
cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2: Importing from ID "1109d899a5ff5fd74bc01e581693685b/3766b952a2dda4c47e71952aeef33c77"...
cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2: Import complete!
  Imported cloudflare_record [id=3766b952a2dda4c47e71952aeef33c77]
cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2: Refreshing state... [id=3766b952a2dda4c47e71952aeef33c77]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

Pokud nyní spustíte terraform plan, si všimnete, že Terraform se už nebude pokoušet znovu vytvořit cloudflare_record prostředky:

terraform plan | grep changes
No changes. Infrastructure is up-to-date.