doc-locale/fr-fr/administration/terraform_state.md
{{< details >}}
{{< /details >}}
GitLab peut être utilisé comme backend pour les fichiers d'état Terraform. Les fichiers sont chiffrés avant d'être stockés. Cette fonctionnalité est activée par défaut.
L'emplacement de stockage de ces fichiers est par défaut :
/var/opt/gitlab/gitlab-rails/shared/terraform_state pour les installations avec le package Linux./home/git/gitlab/shared/terraform_state pour les installations compilées à partir des sources.Ces emplacements peuvent être configurés à l'aide des options décrites ci-dessous.
Utilisez la configuration de stockage d'objets externe pour les installations de GitLab Helm chart.
Vous pouvez désactiver l'état Terraform sur l'ensemble de l'instance. Vous pourriez vouloir désactiver Terraform pour réduire l'espace disque, ou parce que votre instance n'utilise pas Terraform.
Lorsque l'administration des états Terraform est désactivée :
Dans la barre latérale gauche, vous ne pouvez pas sélectionner Opération > États Terraform.
Tous les jobs CI/CD qui accèdent à l'état Terraform échouent avec cette erreur :
Error refreshing state: HTTP remote state endpoint invalid auth
Pour désactiver l'administration Terraform, suivez les étapes ci-dessous en fonction de votre installation.
Prérequis :
Pour les installations avec le package Linux :
Modifiez /etc/gitlab/gitlab.rb et ajoutez la ligne suivante :
gitlab_rails['terraform_state_enabled'] = false
Enregistrez le fichier et reconfigurez GitLab pour que les modifications prennent effet.
Pour les installations compilées à partir des sources :
Modifiez /home/git/gitlab/config/gitlab.yml et ajoutez ou modifiez les lignes suivantes :
terraform_state:
enabled: false
Enregistrez le fichier et redémarrez GitLab pour que les modifications prennent effet.
La configuration par défaut utilise le stockage local. Pour modifier l'emplacement où les fichiers d'état Terraform sont stockés localement, suivez les étapes ci-dessous.
Pour les installations avec le package Linux :
Pour modifier le chemin de stockage, par exemple en /mnt/storage/terraform_state, modifiez /etc/gitlab/gitlab.rb et ajoutez la ligne suivante :
gitlab_rails['terraform_state_storage_path'] = "/mnt/storage/terraform_state"
Enregistrez le fichier et reconfigurez GitLab pour que les modifications prennent effet.
Pour les installations compilées à partir des sources :
Pour modifier le chemin de stockage, par exemple en /mnt/storage/terraform_state, modifiez /home/git/gitlab/config/gitlab.yml et ajoutez ou modifiez les lignes suivantes :
terraform_state:
enabled: true
storage_path: /mnt/storage/terraform_state
Enregistrez le fichier et redémarrez GitLab pour que les modifications prennent effet.
{{< details >}}
{{< /details >}}
Plutôt que de stocker les fichiers d'état Terraform sur disque, nous recommandons l'utilisation de l'une des options de stockage d'objets prises en charge. Cette configuration repose sur des identifiants valides déjà configurés.
En savoir plus sur l'utilisation du stockage d'objets avec GitLab.
Les paramètres suivants sont :
terraform_state_object_store_ sur les installations avec le package Linux.terraform_state: puis object_store: sur les installations compilées manuellement.| Paramètre | Description | Valeur par défaut |
|---|---|---|
enabled | Activer/désactiver le stockage d'objets | false |
remote_directory | Le nom du compartiment où sont stockés les fichiers d'état Terraform | |
connection | Différentes options de connexion décrites ci-dessous |
[!warning] Il n'est pas possible de migrer les fichiers d'état Terraform du stockage d'objets vers le stockage local, veuillez donc procéder avec prudence. Un ticket existe pour modifier ce comportement.
Pour migrer les fichiers d'état Terraform vers le stockage d'objets :
Pour les installations avec le package Linux :
gitlab-rake gitlab:terraform_states:migrate
Pour les installations compilées à partir des sources :
sudo -u git -H bundle exec rake gitlab:terraform_states:migrate RAILS_ENV=production
Vous pouvez éventuellement suivre la progression et vérifier que tous les fichiers d'état Terraform ont bien été migrés à l'aide de la console PostgreSQL :
sudo gitlab-rails dbconsole --database main pour les installations avec le package Linux.sudo -u git -H psql -d gitlabhq_production pour les installations compilées à partir des sources.Vérifiez que objectstg ci-dessous (où file_store=2) contient le nombre total de tous les états :
gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM terraform_state_versions;
total | filesystem | objectstg
------+------------+-----------
15 | 0 | 15
Vérifiez qu'il n'y a aucun fichier sur le disque dans le dossier terraform_state :
sudo find /var/opt/gitlab/gitlab-rails/shared/terraform_state -type f | grep -v tmp | wc -l
Vous devriez utiliser les paramètres de stockage d'objets consolidés. Cette section décrit l'ancien format de configuration.
Consultez les paramètres de connexion disponibles pour les différents fournisseurs.
{{< tabs >}}
{{< tab title="Linux package (Omnibus)" >}}
Modifiez /etc/gitlab/gitlab.rb et ajoutez les lignes suivantes, en remplaçant par les valeurs souhaitées :
gitlab_rails['terraform_state_object_store_enabled'] = true
gitlab_rails['terraform_state_object_store_remote_directory'] = "terraform"
gitlab_rails['terraform_state_object_store_connection'] = {
'provider' => 'AWS',
'region' => 'eu-central-1',
'aws_access_key_id' => 'AWS_ACCESS_KEY_ID',
'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY'
}
[!note] Si vous utilisez des profils AWS IAM, veillez à omettre la clé d'accès AWS et les paires clé/valeur de clé d'accès secrète.
gitlab_rails['terraform_state_object_store_connection'] = {
'provider' => 'AWS',
'region' => 'eu-central-1',
'use_iam_profile' => true
}
Enregistrez le fichier et reconfigurez GitLab pour que les modifications prennent effet.
{{< /tab >}}
{{< tab title="Self-compiled (source)" >}}
Modifiez /home/git/gitlab/config/gitlab.yml et ajoutez ou modifiez les lignes suivantes :
terraform_state:
enabled: true
object_store:
enabled: true
remote_directory: "terraform" # The bucket name
connection:
provider: AWS # Only AWS supported at the moment
aws_access_key_id: AWS_ACCESS_KEY_ID
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
region: eu-central-1
Enregistrez le fichier et redémarrez GitLab pour que les modifications prennent effet.
{{< /tab >}}
{{< /tabs >}}
Les fichiers d'état Terraform sont stockés dans le chemin de répertoire haché du projet concerné.
Le format du chemin est /var/opt/gitlab/gitlab-rails/shared/terraform_state/<path>/<to>/<projectHashDirectory>/<UUID>/0.tfstate, où UUID est défini de façon aléatoire.
Pour trouver le chemin d'un fichier d'état :
Ajoutez get-terraform-path à votre shell :
get-terraform-path() {
PROJECT_HASH=$(echo -n $1 | openssl dgst -sha256 | sed 's/^.* //')
echo "${PROJECT_HASH:0:2}/${PROJECT_HASH:2:2}/${PROJECT_HASH}"
}
Exécutez get-terraform-path <project_id>.
$ get-terraform-path 650
20/99/2099a9b5f777e242d1f9e19d27e232cc71e2fa7964fc988a319fce5671ca7f73
Le chemin relatif s'affiche.
Pour restaurer les fichiers d'état Terraform à partir de sauvegardes, vous devez avoir accès aux fichiers d'état chiffrés et à la base de données GitLab.
La table de base de données suivante permet de retrouver le chemin S3 associé à des projets spécifiques :
terraform_states : Contient les informations d'état de base, y compris l'identifiant universel unique (UUID) pour chaque état.Les fichiers d'état sont stockés dans une structure de répertoires spécifique, où :
terraform_states qui fait partie du chemin.Par exemple, pour un projet où :
12345example-uuidSi la valeur de hachage SHA-256 de 12345 est 5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5, la structure de dossiers serait :
terraform/ <- configured Terraform storage directory
├─ 59/ <- first and second character of project ID hash
| ├─ 94/ <- third and fourth character of project ID hash
| | ├─ 5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5/ <- full project ID hash
| | | ├─ example-uuid/ <- state UUID
| | | | ├─ 1.tf <- individual state versions
| | | | ├─ 2.tf
| | | | ├─ 3.tf
Les fichiers d'état sont chiffrés à l'aide de Lockbox et nécessitent les informations suivantes pour le déchiffrement :
db_key_baseLa clé de chiffrement est dérivée à la fois de db_key_base et de l'ID du projet. Si vous ne pouvez pas accéder à db_key_base, le déchiffrement n'est pas possible.
Pour savoir comment déchiffrer manuellement des fichiers, consultez la documentation de Lockbox.
Pour consulter le processus de génération des clés de chiffrement, voir le code de l'outil de téléchargement d'état.