作为处理基础架构即代码 (IaC) 的软件专业人员,您很可能经常使用
请务必注意,您可以将该状态文件存储在 S3 存储桶中并使用 DynamoDB 来管理锁定状态。但是,这种方法将迫使您创建额外的资源,这使其成为一个复杂的选择,尤其是在客户端使用 GitLab 的情况下。 GitLab 最近通过提供一种存储和管理 Terraform 状态的方法,以及一种围绕它设置 CI 的简单方法,降低了集成 Terraform 的入门门槛。
在这篇博文中,我们将解释什么是 Terraform 状态文件,如何将其迁移到 GitLab,并为其设置 CI 管道。您可以访问我们的存储库
Terraform 通过状态文件记录有关代码中定义的基础设施的任何信息。它以 JSON 编写,本质上记录了从 Terraform 代码到创建的真实资源的映射。下面是 terraform.tfstate 的示例。
首先,每次运行 Terraform 时,它都会获取其 EC2 实例的最新状态,并将其与 Terraform 配置进行比较,以确定需要应用哪些更改。
{ "version": 4, "terraform_version": "0.12.0", "serial": 1, "lineage": "1f2087f9-4b3c-1b66-65db-8b78faafc6fb", "outputs": {}, "resources": [ { "mode": "managed", "type": "aws_instance", "name": "example", "provider": "provider.aws", "instances": [ { "schema_version": 1, "attributes": { "ami": "ami-0c55b159cbfafe1f0", "availability_zone": "us-west-2a", "id": "i-00a123a0accffffff", "instance_state": "running", "instance_type": "t2.micro", "(...)": "(truncated)" } } ] } ] }
默认情况下,此 terraform.tfstate 存储在您拥有 Terraform 文件、规划和应用更改的本地位置。对于您只是运行一些测试的个人项目,这很好但不是推荐的方式,原因如下:
随着 Terraform 被认为是云基础设施配置的标准,GitLab 开始提供一种存储和管理 Terraform 状态的方法已经有一年左右的时间了。出于这个原因,我们希望与您分享迁移过程,因为我们最近开始使用 GitLab 来管理我们的 IaC。
对于本文,我们假设您正在使用本地状态,并使用 AWS S3 Bucket 或其他后端解决方案管理您的状态。
首先,您需要更改 backend.tf 以使用 HTTP。
terraform { backend "http" {} }
接下来,您需要在终端中设置 4 个变量:
__ __
PROJECT_ID="28450092" TF_USERNAME="florianpialoux" TF_PASSWORD="123456789" TF_ADDRESS="https://gitlab.com/api/v4/projects/${PROJECT_ID}/terraform/state/aws-buckets"
您现在可以运行迁移命令,使用以下命令将您的 Terraform 状态从他以前的位置移动到 GitLab:
terraform init \ -migrate-state \ -backend-config=address=${TF_ADDRESS} \ -backend-config=lock_address=${TF_ADDRESS}/lock \ -backend-config=unlock_address=${TF_ADDRESS}/lock \ -backend-config=username=${TF_USERNAME} \ -backend-config=password=${TF_PASSWORD} \ -backend-config=lock_method=POST \ -backend-config=unlock_method=DELETE \ -backend-config=retry_wait_min=5
您需要提供“是”的确认,以便 GitLab 可以开始管理您的状态文件。这是从本地状态到 GitLab 的示例:
__ __
GitLab 的示例 s3
__ __
现在您可以从 GitLab 界面导航到Infrastructure > Terraform并查看您的状态:
__ __
我注意到即使在使用之前运行的 migrate-state 命令之后,我从 s3 获得的一些状态文件仍然是空白的,在这种情况下,您可以运行以下命令:
terraform state pull > aws-buckets.json
从 s3 状态复制并粘贴内容并运行推送:
terraform state push -lock=true aws-buckets.json
GitLab 支持 Terraform 状态文件的版本控制,但通过 WebUI 查看/恢复旧版本将需要您使用
GitLab 提供
terraform apply 作业运行后,您将能够看到使用状态的时间以及使用的管道。
__ __
了解更多关于我们的gitlab-ci.yml的样子
__ __
您可能已经注意到,查看我们添加的 gitlab-ci.yaml
让 Terraform 状态和 CI 在 Gitlab 上运行是遵循 GitOps 最佳实践的好方法。它们都是开发和部署 IaC 的绝佳组合。由于你们中的大多数人可能已经在为您的存储库使用 GitLab,因此将 IaC 放在一个屋檐下并让 GitLab 通过支持传输中和静态加密以及版本控制、锁定和解锁来管理您的 Terraform 状态变得更加简单状态。
也发布在这里。