← Poskytovatel Cloudflare Terraform / terraform / advanced-topics
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:
- A konfigurační soubor ↗ (končící na
.tf) která definuje konfiguraci prostředků, které má Terraform spravovat. S tímto souborem jste pracovali v jednotlivých krocích tutoriálu. - Místní stavový soubor ↗ která mapuje názvy prostředků definované ve vašem konfiguračním souboru, například
cloudflare_load_balancer.www-lbk prostředkům, které existují v Cloudflare.
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-terraformingPokud 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:
- Příkaz, který se má spustit (například
generateneboimport). - Váš e-mail uživatele Cloudflare:
--emailnebo-e. - Váš API token Cloudflare:
--tokennebo-t. - Účet a/nebo zóna, ze které se mají čerpat prostředky -
--account/--zonenebo-a/-z. - 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:
- Konfigurace Terraformu daného prostředku (definovaná v
.tfsoubor) - Doprovodný stavový soubor Terraformu se stavem daného prostředku (definovaný v
.tfstatesoubor)
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.tfPokud 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 planTerraform 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.
-
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 -
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/3766b952a2dda4c47e71952aeef33c77Jednotlivé příkazy byste spouštěli v terminálu samostatně:
terraform import cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 1109d899a5ff5fd74bc01e581693685b/3c0b456bc2aa443089c5f40f45f51b31cloudflare_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/d09d916d059aa9fc8cb54bdd49deea5fcloudflare_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/8d6ec0d02c5b22212ff673782c816ef8cloudflare_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/3766b952a2dda4c47e71952aeef33c77cloudflare_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 changesNo changes. Infrastructure is up-to-date.