J'essaie de déployer un pipeline Bitbucket à l'aide de Terraform V0.14.3 pour créer des ressources dans Google Cloud. Après avoir exécuté la commande Terraform, le pipeline échoue avec cette erreur:
terraform { backend "gcs" { bucket = "some-bucket" prefix = "terraform/state" credentials = "key.json" #this is just a bitbucket pipeline variable } required_providers { google = { source = "hashicorp/google" version = "~> 2.20.0" } } } provider "google" { project = var.project_ID credentials = "key.json" region = var.project_region }
Nous avons mis à jour notre version locale de Terraform à V.0.13.0 puis exécutée: terraform 0.13upgrade
comme référencé dans ce guide: https://www.terraform.io/upgrade-uides /0-13.html . Un fichier versions.tf a été généré nécessitant une version Terraform> = 0,13 et notre bloc de fournisseur requis ressemble maintenant à ceci:
Error: Invalid legacy provider address This configuration or its associated state refers to the unqualified provider "google". You must complete the Terraform 0.13 upgrade process before upgrading to later versions.
Nous obtenons toujours la même erreur lors de l'initiation du pipeline Bitbucket. Quelqu'un sait-il comment dépasser cette erreur? Merci d'avance.
9 Réponses :
Pendant que vous étiez sous TF13, avez-vous appliqué State au moins une fois pour le projet en cours d'exécution?
Selon les documents TF: https://www.terraform.io/ Guides de mise à niveau / 0-14.html
Il n'y a pas de commande de mise à jour automatique (séparément) dans 0,14 (comme il y en avait dans 0,13). La seule façon de mettre à niveau est de forcer l'état sur un projet au moins une fois, alors qu'il était sous commande lors du déplacement de TF13 à 14.
Vous pouvez également essayer terraform init dans le répertoire du projet.
Merci, c'est un bon point et je n'ai pas lu la documentation assez étroitement initialement pour réaliser que l'application de l'état était nécessaire. Cependant, je suppose que cela signifierait que je devrais l'exécuter localement - ce qui n'est pas une bonne option dans ma situation ... en espérant qu'il pourrait y avoir un moyen de contourner cela.
Essayez de changer Hashicorp / Google (dans les fournisseurs de req) à Hashicorp / Terraform-Provider-Google. Je crois que c'est le nouveau lien source. De plus, vous devriez penser à mettre à jour sur Google 3.5 (le dernier versioning)
Si vous utilisez une version plus récente de Terraform, telle que v0.14.x
, vous devriez:
Utilisez le Replace-Provider
sous-commande
terraform init #=> Initializing the backend... Initializing provider plugins... - Reusing previous version of hashicorp/google from the dependency lock file - Using previously-installed hashicorp/google vx.xx.x Terraform has been successfully initialized! You may now begin working with Terraform. Try . . .
Initialisez à nouveau Terraform:
terraform state replace-provider \ -auto-approve \ "registry.terraform.io/-/google" \ "hashicorp/google" #=> Terraform will perform the following actions: ~ Updating provider: - registry.terraform.io/-/google + registry.terraform.io/hashicorp/google Changing x resources: . . . Successfully replaced provider for x resources.
terraform ne prend en charge que les mises à niveau d'une mise à niveau principale de fonctionnalités à la fois. Votre fichier d'État plus ancien a été, plus que probablement, créé à l'aide d'une version plus tôt que v0.13.x
.
Si vous n'avez pas exécuté le Appliquer
Commande Avant de mettre à niveau votre version Terraform, vous pouvez vous attendre à cette erreur: la mise à niveau de v0.13.x
vers v0.14.x
était pas complet.
Vous pouvez trouver plus d'informations ici .
Hey @ laura-h! Si cette réponse a résolu votre question, veuillez envisager de l'accepter en cliquant sur la marque de contrôle. Cela indique à la communauté au sens large que vous avez trouvé une solution et que vous donnez une certaine réputation au répondeur et à vous-même.
Nous avons rencontré un problème similaire dans nos environnements opérationnels aujourd'hui. Nous avons terminé avec succès la commande terraform 0.13upgrade
. Cela a en effet introduit un fichier versions.tf
.
Cependant, effectuer une Terraform init
avec cette configuration n'était toujours pas possible, et l'erreur suivante est apparue: p >
terraform state replace-provider "registry.terraform.io/-/google" "hashicorp/google"
Une enquête plus approfondie dans le fichier d'état a révélé que, pour certaines ressources, le bloc du fournisseur était pas mis à jour. Nous avons donc dû exécuter la commande suivante pour finaliser le processus de mise à niveau.
Error: Invalid legacy provider address
Modifier Le déploiement dans l'environnement suivant a révélé que cela a été causé par des ressources conditionnelles. Pour activer / désactiver facilement certaines ressources, nous tirons parti de l'attribut compter
et utilisons 0 ou 1. Pour les ressources avec count = 0
, qui étaient inchangées avec Terraform 0.13, le fournisseur n'a pas été mis à jour.
Dans notre cas, nous étions sur AWS et avons eu une erreur similaire Les étapes à résoudre devaient s'assurer que la syntaxe a été mise à niveau en exécutant Spécifique du problème OPS, si le problème se produit toujours, vérifiez l'accès à l'emplacement du seau à partir du local et du pipeline. Vérifiez également la version de Terraform en cours d'exécution dans le pipeline. Selon la configuration, il peut s'agir que le fichier d'état distant est / peut être mis à jour. Terraform init
, en vérifiant à nouveau Les avertissements et enfin mis à jour le fichier d'état avec la méthode suivante. # update provider in state file
terraform state replace-provider -- -/aws hashicorp/aws
# reinit
terraform init
J'ai rencontré le même problème avec AWS. La solution @MirageGlobe a fonctionné.
Mon cas était comme celui-ci
Terraform will perform the following actions: ~ Updating provider: - registry.terraform.io/-/openstack + registry.terraform.io/terraform-provider-openstack/openstack Changing 11 resources: openstack_compute_servergroup_v2.kubernetes_master openstack_networking_network_v2.kube_router openstack_compute_instance_v2.kubernetes_worker openstack_networking_subnet_v2.internal openstack_networking_subnet_v2.kube_router data.openstack_networking_network_v2.external_network openstack_compute_instance_v2.kubernetes_etcd openstack_networking_router_interface_v2.internal openstack_networking_router_v2.internal openstack_compute_instance_v2.kubernetes_master openstack_networking_network_v2.internal Do you want to make these changes? Only 'yes' will be accepted to continue. Enter a value: yes Successfully replaced provider for 11 resources.
pour résoudre le problème
terraform state replace-provider -- -/openstack terraform-provider-openstack/openstack
La commande suivante
remove the .terraform folder
Après cette commande, vous verrez l'impression ci-dessous, entrez oui
Error: Invalid legacy provider address This configuration or its associated state refers to the unqualified provider "openstack". You must complete the Terraform 0.13 upgrade process before upgrading to later versions.
Pour ajouter, j'avais installé Terraform 0.14.6 mais l'état semblait être coincé dans 0,12. Dans mon cas, j'avais 3 références qui étaient désactivées, cet article m'a aidé à identifier lesquels (toutes les entrées des "fournisseurs requis par l'État" qui avaient un - dans le lien. https://github.com/hashicorp/terraform/issues/27615 Je l'ai corrigé en exécutant la commande Remplace-Provider pour chaque entrée qui était désactivée, puis en exécutant Terraform init. Je note de le faire et d'exécuter un diff git, le tfState a été mis à jour et utilise désormais 0.14.x terraform au lieu de mon 0.12.x précédent. c'est-à-dire
terraform providers terraform state replace-provider registry.terraform.io/-/azurerm registry.terraform.io/hashicorp/azurerm
Gérer les fournisseurs de terraforms, vous pouvez voir lequel fait le conflit. Merci!
Une explication de ce qu'il faut rechercher dans la sortie des fournisseurs Terraform
serait utile.
Même problème pour moi. J'ai couru:
terraform state replace-provider registry.terraform.io/-/google registry.terraform.io/hashicorp/google
qui m'a donné:
Providers required by configuration: registry.terraform.io/hashicorp/google Providers required by state: registry.terraform.io/-/google
Explication : Votre projet TerraForm contient tf.state
fichier qui est obsolète et arbitrant à l'ancienne adresse du fournisseur. Le message d'erreur présentera cette erreur:
~ Updating provider: - registry.terraform.io/-/aws + registry.terraform.io/hashicorp/aws
solution : Afin de résoudre ce problème, vous devez modifier le tf. État
références à Link vers les nouveaux fournisseurs requis, mettez à jour le fichier tf.state et initialisez à nouveau le projet. Les étapes sont:
versions.tf
Fichier. Exemple:
terraform state replace-provider registry.terraform.io/-/aws registry.terraform.io/hashicorp/aws
Commande TerraForm Providers
pour présenter les fournisseurs requis de la configuration par rapport aux fournisseurs requis qui ont enregistré à l'état. Exemple:
Providers required by configuration: . âââ provider[registry.terraform.io/hashicorp/aws] >= 3.35.0 Providers required by state: provider[registry.terraform.io/-/aws]
la commande TerraForm State Remplace-Provider
) afin que nous puissions dire à Terraform comment interpréter le fournisseur hérité. La sous-commande Terraform State Remplace-Provider permet de réaffecter Adresses de source du fournisseur enregistrées dans l'État de Terraform, et donc nous Peut utiliser cette commande pour dire à Terraform comment réinterpréter le "héritage" les adresses du fournisseur comme des fournisseurs correctement conformes à des noms qui correspondent avec la source du fournisseur adresse dans la configuration.
AVERTISSE Les sous-commandes d'État Terraform créeront un nouvel instantané d'État et Écrivez-le dans le backend configuré. Une fois que la commande a réussi le Le dernier instantané d'État utilisera la syntaxe que Terraform v0.12 ne peut pas Comprenez, donc vous ne devriez effectuer cette étape que lorsque vous êtes prêt à Mettez en scène en permanence vers Terraform v0.13.
Exemple:
terraform { required_version = ">= 0.14" required_providers { aws = { source = "hashicorp/aws" version = ">= 3.35.0" } } }
Le Terraform State Replace-Provider Registry.terraform.io/-/aws registry.terraform.io/hashicorp/aws
l'a corrigé pour moi avec le fournisseur AWS - thnx
J'ai récemment rencontré cela en utilisant Terraform Cloud pour le backend distant. Nous avions des espaces de travail liés à l'AWS plus anciens définis sur la version 0.12.4 (dans le cloud) qui se sont trompés avec "l'adresse du fournisseur hérité non valide" et refusé d'exécuter avec le dernier client Terraform 1.1.8.
J'ajoute ma réponse Parce que c'est beaucoup plus simple que les autres réponses. Nous n'avons fait aucun des éléments suivants:
terraform providers terraform 0.13upgrade remove the .terraform folder terraform state replace-provider
Au lieu de cela, nous sommes simplement:
Notez que nous avions également besoin de mettre à jour quelques ressources liées à l'AWS S3 à la nouvelle syntaxe du fournisseur AWS pour que tous nos espaces de travail fonctionnent avec le dernier fournisseur.