【问题标题】:How do I supply an API token to the GitLab Terraform provider as a Terraform secret resource?如何将 API 令牌作为 Terraform 秘密资源提供给 GitLab Terraform 提供者?
【发布时间】:2021-07-17 19:58:48
【问题描述】:

我正在尝试使用 Terraform 来管理一些 GitLab(自托管)配置。 Terraform GitLab 提供程序需要 GitLab 个人访问令牌才能进行 API 调用以读取和写入配置。当我尝试使用 Terraform secret_resource 提供此令牌时,Terraform 无法让我管理机密。当我尝试导入密钥时,Terraform 失败:

$ terraform import secret_resource.api_token "xxx"                                                                                        
secret_resource.api_token: Importing from ID "xxx"...
secret_resource.api_token: Import prepared!
  Prepared secret_resource for import
secret_resource.api_token: Refreshing state... [id=-]

Error: GET https://gitlab.example.com./api/v4/user/api/v4/user: 404 {error: 404 Not Found}

  on /path/to/providers.tf line 24, in provider "gitlab":                                                                                                          
  24: provider "gitlab" {

这是重现此行为的最小 Terraform:

terraform {
  required_version = "~> 0.13.6"                                                                                     

  required_providers {
    gitlab = {
      source = "nixpkgs/gitlab"
      version = "> 3.4.99"                                                                                           
    }
    secret = {
      source = "nixpkgs/secret"
      version = "~> 1.1"                                                                                             
      alias = "default"                                                                                              
    }
  }
}

resource "secret_resource" "api_token" {                                                                             
  lifecycle {
    prevent_destroy = true
  }
}

provider "gitlab" {                                                                                                  
  base_url = "https://gitlab.example.com./api/v4/user"                                             
  token = secret_resource.api_token.value                                                                            
}

resource "gitlab_project" "foo" {
    name = "foo"
}

我省略了真正的主机名和 GitLab 令牌值。通过使用此配置初始化一个新的 Terraform 根模块,然后尝试导入密钥,我可以可靠地重现此故障。

这似乎是一个不合理的失败 - secret_resource 不依赖于 GitLab 提供者。如果 Terraform 允许导入该值,那么它将可用,然后 GitLab 提供程序将被正确配置。

我观察到这种行为:

  • Terraform v0.13.6
    • 提供者 registry.terraform.io/nixpkgs/gitlab v3.4.999(git rev 68c8c0e4cf14fda698bcacb74cb01fcfe7128815)
    • 提供者 registry.terraform.io/nixpkgs/secret v1.1.1

我希望能够继续使用secret_resource 来管理 GitLab API 令牌。我该怎么办?

【问题讨论】:

    标签: terraform credentials terraform-provider-gitlab terraform-provider-secrets


    【解决方案1】:

    从错误消息来看,base_url 似乎配置不正确。 /api/v4/user 出现两次:

    Error: GET https://gitlab.example.com./api/v4/user/api/v4/user: 404 {error: 404 Not Found}
    

    尝试将base_url 设置为主机名,使用斜线:

    provider "gitlab" {                                                                                                  
      base_url = "https://gitlab.example.com/"                                             
      token = secret_resource.api_token.value                                                                            
    }
    

    【讨论】:

    • 很棒的收获。这似乎是我在尝试最小化示例时引入的一个真正的错误。 :/这可能是对所问问题的最佳答案。在决定之前,我想再深入一点。不管怎样,谢谢你。
    • 你原来的问题解决了吗?如果没有,也许您可​​以更新问题。
    • 这不是真的。我正在考虑发布一个带有更正细节的新问题,但后来我发现 Terraform 文档基本上说我想要的东西是不可能的。所以我现在改变了我想要的(这是次优的),我稍后会重新审视所有这些,也许在 Terraform 变得更好之后。
    【解决方案2】:

    地址中还有一个点 (gitlab.example.com.),应该是 gitlab.example.com

    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2021-03-08
    • 1970-01-01
    • 2018-07-30
    • 2018-11-11
    • 2020-03-14
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多