Gitlab

Gitlab 作為帶有 HTTP 後端的 Terraform 狀態管理,不使用項目憑據?

  • April 16, 2021

我一直在努力為 Terraform 建立一個 monorepo 並執行。Terraform 在容器內執行。但是,當我嘗試將inithttp 指向我的自託管 Gitlab 的後端時,它返回為需要身份驗證:

Successfully configured the backend "http"! Terraform will automatically
use this backend unless the backend configuration changes.
2021-04-15T13:02:00.815Z [TRACE] Meta.Backend: instantiated backend of type *http.Backend
2021-04-15T13:02:00.815Z [DEBUG] checking for provisioner in "."
2021-04-15T13:02:00.815Z [DEBUG] checking for provisioner in "/bin"
2021-04-15T13:02:00.815Z [INFO]  Failed to read plugin lock file .terraform/plugins/linux_amd64/lock.json: open .terraform/plugins/linux_amd64/lock.json: no such file or directory
2021-04-15T13:02:00.815Z [TRACE] Meta.Backend: backend *http.Backend does not support operations, so wrapping it in a local backend
2021/04/15 13:02:00 [DEBUG] GET https://gitlab.my_domain.tld/api/v4/projects/2/terraform/state/infrastructure
Error refreshing state: HTTP remote state endpoint requires auth

我已經確認我的項目令牌確實可以通過對具有 API 訪問權限的令牌的項目使用 curl 來工作:

bash-5.1# curl -k -I "https://gitlab.my_domain.tld/api/v4/projects?<my_token_id>"
HTTP/2 200 
server: nginx
date: Wed, 14 Apr 2021 23:59:43 GMT
content-type: application/json
vary: Accept-Encoding
cache-control: no-cache
link: <https://gitlab.my_domain.tld/api/v4/projects?&lt;my_token_id&gt;=&membership=false&order_by=created_at&owned=false&page=1&per_page=20&repository_checksum_failed=false&simple=false&sort=desc&starred=false&statistics=false&wiki_checksum_failed=false&with_custom_attributes=false&with_issues_enabled=false&with_merge_requests_enabled=false>; rel="first", <https://gitlab.my_domain.tld/api/v4/projects?&lt;my_project_token&gt;=&membership=false&order_by=created_at&owned=false&page=1&per_page=20&repository_checksum_failed=false&simple=false&sort=desc&starred=false&statistics=false&wiki_checksum_failed=false&with_custom_attributes=false&with_issues_enabled=false&with_merge_requests_enabled=false>; rel="last"
vary: Origin
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-gitlab-feature-category: projects
x-next-page:
x-page: 1
x-per-page: 20
x-prev-page:
x-request-id: 01F39D73G8ZXPJ1E1ZAK0ZS860
x-runtime: 0.184197
x-total: 1
x-total-pages: 1
strict-transport-security: max-age=31536000
referrer-policy: strict-origin-when-cross-origin

bash-5.1# 

憑據不會通過,-backend-config也不會直接放入backend.tfvars我在後端擁有的文件中:

backend.tf:

terraform {
   backend "http" { }
}

後端.tfvars:

lock_method = "POST" 
unlock_method = "DELETE" 
retry_max = "3" 
skip_cert_verification = true

我已經通過導出確認 和 的值TF_HTTP_USERNAMETF_HTTP_PASSWORD在環境變數中設置的。見鬼,我什至將它們設置為全域變數:

declare -x TERRAFORM_VERSION="0.15.0"
declare -x TF_HTTP_PASSWORD="[MASKED]"
declare -x TF_HTTP_USERNAME="project_2_bot"
declare -x TF_LOG="trace"
declare -x TF_PASSWORD="[MASKED]"
declare -x TF_USERNAME="project_2_bot"
declare -x bot_2_token="[MASKED]"

我檢查了 api_json.json 的 Gitlab 日誌,我看到請求進來了,但是使用 INFO 他們並沒有告訴我太多,只是嘗試進來了:

{
 "time": "2021-04-15T13:02:00.924Z",
 "severity": "INFO",
 "duration_s": 0.00915,
 "db_duration_s": 0.00207,
 "view_duration_s": 0.00708,
 "status": 401,
 "method": "GET",
 "path": "/api/v4/projects/2/terraform/state/infrastructure",
 "params": [],
 "host": "gitlab.my_domain.tld",
 "remote_ip": "10.4.6.95, 127.0.0.1",
 "ua": "Go-http-client/1.1",
 "route": "/api/:version/projects/:id/terraform/state/:name",
 "queue_duration_s": 0.011228,
 "db_count": 2,
 "db_write_count": 0,
 "db_cached_count": 1,
 "cpu_s": 0.017418,
 "mem_objects": 10346,
 "mem_bytes": 423664,
 "mem_mallocs": 1771,
 "correlation_id": "01F3ASZH67FMVS0449NC289C47",
 "meta.caller_id": "/api/:version/projects/:id/terraform/state/:name",
 "meta.remote_ip": "10.4.6.95",
 "meta.feature_category": "infrastructure_as_code",
 "meta.client_id": "ip/10.4.6.95"
}

我正在嘗試找出如何提高日誌級別以擷取所有進入 API 的事件,但到目前為止還沒有。

每次我嘗試對後端執行命令時,它都會返回:

Error refreshing state: HTTP remote state endpoint requires auth

我試過 Terraform 版本 0.14.x(不記得最新的是什麼)和 0.15

而且我已經沒有辦法去看了。任何人都經歷過這種情況或就如何進一步排除故障提供想法?

好的,我認為這對於任何關注或在以後的搜尋中找到它的觀眾來說都很重要。

所以,出現了兩個問題:

我認為 Terraform 和自簽名證書行為存在問題(這甚至可能是下面的 go 程式碼)。因為即使我告訴它不要檢查證書,它仍然會報告一個非常奇怪的錯誤,即證書使用的是通用名稱,而不是 SAN 值。但這是另一個問題的徵兆。

我的實際問題是,我認為 Gitlab 文件是錯誤的。

所以根據這裡的gitlab文件說,在第4步:

4. Create a Personal Access Token with the api scope.

其中,我創建了一個Project Token ,而不是使用許可證席位計數的個人訪問令牌。

此令牌是項目的本地令牌,使用者名為

project_$(project_id)_bot#

就我而言,哪個是 project_2_bot (沒有數字,因為它是第一個,愚蠢)

根據文件,它說令牌需要 API 訪問才能訪問 API。

我相信文件是錯誤的。我創建的令牌只有 API 訪問權限,並且一直失敗。一旦我給了它更多訪問權限(api、對容器、系統資料庫、儲存庫的讀/寫),它實際上就通過了。

引用自:https://serverfault.com/questions/1060489