Terraform 状态管理
极狐GitLab 可以用作 Terraform 状态文件的后端。文件在存储之前被加密。默认情况下启用此功能。
这些文件的存储位置默认为:
- Linux 软件包安装实例:
/var/opt/gitlab/gitlab-rails/shared/terraform_state
。 - 源安装实例:
/home/git/gitlab/shared/terraform_state
。
这些位置可以使用下面描述的选项进行配置。
使用外部对象存储配置极狐GitLab Helm charts 安装实例。
禁用 Terraform 状态
您可以在整个实例中禁用 Terraform 状态。您可能想要减少磁盘空间,或者因为您的实例不使用 Terraform,而禁用 Terraform。
当禁用 Terraform 状态管理时:
- 在左侧边栏中,您不能选择 运维 > Terraform 状态。
-
任何访问 Terraform 状态的 CI/CD 作业都失败并出现以下错误:
Error refreshing state: HTTP remote state endpoint invalid auth
要禁用 Terraform 管理,请根据您的安装实例执行以下步骤。
先决条件:
- 您必须是管理员。
Linux 软件包安装:
-
编辑
/etc/gitlab/gitlab.rb
并添加以下行:gitlab_rails['terraform_state_enabled'] = false
-
保存文件并重新配置极狐GitLab,使更改生效。
源安装:
-
编辑
/home/git/gitlab/config/gitlab.yml
并添加或修改以下行:terraform_state: enabled: false
-
保存文件并重启极狐GitLab,使更改生效。
使用本地存储
默认配置使用本地存储。要更改 Terraform 状态文件在本地存储的位置,请按照以下步骤操作。
Linux 软件包安装:
-
要将存储路径更改为例如
/mnt/storage/terraform_state
,编辑/etc/gitlab/gitlab.rb
并添加以下行:gitlab_rails['terraform_state_storage_path'] = "/mnt/storage/terraform_state"
-
保存文件并重新配置极狐GitLab,使更改生效。
源安装:
-
要将存储路径更改为
/mnt/storage/terraform_state
,请编辑/home/git/gitlab/config/gitlab.yml
并添加或修改以下行:terraform_state: enabled: true storage_path: /mnt/storage/terraform_state
-
保存文件并重启极狐GitLab,使更改生效。
使用对象存储
我们建议使用支持的对象存储选项之一,而不是将 Terraform 状态文件存储在磁盘上。 此配置依赖于已配置的有效凭据。
对象存储设置
以下设置是:
- 源安装实例:嵌套在
terraform_state:
和object_store:
下。 - Linux 软件包安装实例:以
terraform_state_object_store_
为前缀。
设置 | 描述 | 默认值 |
---|---|---|
enabled |
启用/禁用对象存储 | false |
remote_directory |
存储 Terraform 状态文件的存储桶名称 | |
connection |
下面描述的各种连接选项 |
迁移到对象存储
引入于 13.9 版本。
要将 Terraform 状态文件迁移到对象存储,请按照以下说明进行操作。
-
对于 Linux 软件包安装实例:
gitlab-rake gitlab:terraform_states:migrate
-
对于源安装实例:
sudo -u git -H bundle exec rake gitlab:terraform_states:migrate RAILS_ENV=production
您可以选择跟踪进度并使用 PostgreSQL 控制台验证所有包是否已成功迁移:
-
sudo gitlab-rails dbconsole --database main
:用于 Linux 软件包安装实例。 -
sudo -u git -H psql -d gitlabhq_production
:用于源安装实例。
验证下面的 objectstg
(其中 file_store=2
)具有所有状态的计数:
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
验证 terraform_state
文件夹中的磁盘上没有文件:
sudo find /var/opt/gitlab/gitlab-rails/shared/terraform_state -type f | grep -v tmp | wc -l
S3 兼容的连接设置
您应该使用合并的对象存储设置。这部分描述了早先的配置格式。
查看不同提供商的可用连接设置。
::Tabs
:::TabTitle Linux package (Omnibus)
-
编辑
/etc/gitlab/gitlab.rb
并添加以下行;替换为您想要的值: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' }
如果您使用 AWS IAM 配置文件,请务必省略 AWS 访问密钥和秘密访问密钥/值对。gitlab_rails['terraform_state_object_store_connection'] = { 'provider' => 'AWS', 'region' => 'eu-central-1', 'use_iam_profile' => true }
- 保存文件并重新配置极狐GitLab,使更改生效。
- 将任何现有的本地状态迁移到对象存储。
:::TabTitle Self-compiled (source)
-
编辑
/home/git/gitlab/config/gitlab.yml
并添加或修改以下行: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
- 保存文件并重新启动极狐GitLab,使更改生效。
- 将任何现有的本地状态迁移到对象存储。
::EndTabs
查找 Terraform 状态文件路径
Terraform 状态文件存储在相关项目的哈希目录路径中。
路径的格式是 /var/opt/gitlab/gitlab-rails/shared/terraform_state/<path>/<to>/<projectHashDirectory>/<UUID>/0.tfstate
,其中 UUID 是随机定义的。
要找到状态文件路径:
-
将
get-terraform-path
添加到您的 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}" }
-
运行
get-terraform-path <project_id>
。$ get-terraform-path 650 20/99/2099a9b5f777e242d1f9e19d27e232cc71e2fa7964fc988a319fce5671ca7f73
先对路径就会显示出来了。