我遇到了同样的问题,我最终所做的是标记化SYSTEM_ACCESSTOKEN
在地形配置中。我在 Azure DevOps 中使用了 Tokenzization 任务,其中__
前缀和后缀用于识别标记并将其替换为实际变量(它是可定制的,但我发现双下划线最适合不干扰我拥有的任何代码)
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
displayName: 'Replace tokens'
inputs:
targetFiles: |
**/*.tfvars
**/*.tf
tokenPrefix: '__'
tokenSuffix: '__'
就像是find $(Build.SourcesDirectory)/ -type f -name 'main.tf' -exec sed -i 's~__SYSTEM_ACCESSTOKEN__~$(System.AccessToken)~g' {} \;
如果您无法将自定义扩展安装到您的 DevOps 组织,那么也可以使用。
我的 terraform main.tf 如下所示:
module "app" {
source = "git::https://token:[email protected] /cdn-cgi/l/email-protection/actualOrgName/actualProjectName/_git/TerraformModules//azure/app-service?ref=__app-service-module-ver__"
....
}
它并不漂亮,但它可以完成工作。模块源(在撰写本文时)不支持来自 terraform 的变量输入。因此,我们可以做的是使用 Terrafile,它是一个开源项目,通过在代码旁边保留一个简单的 YAML 文件,帮助您跟上可能使用的模块和同一模块的不同版本。它似乎不再被积极维护,但它仍然有效:https://github.com/coretech/terrafile https://github.com/coretech/terrafile我的 Terrafile 示例:
app:
source: "https://token:[email protected] /cdn-cgi/l/email-protection/actualOrgName/actualProjectName/_git/TerraformModules"
version: "feature/handle-twitter"
app-stable:
source: "https://token:[email protected] /cdn-cgi/l/email-protection/actualOrgName/actualProjectName/_git/TerraformModules"
version: "1.0.5"
Terrafile 默认情况下将模块下载到 ./vendor 目录,以便您可以将模块源指向如下所示:
module "app" {
source = "./vendor/modules/app-stable/azure/app_service"
....
}
现在你只需要弄清楚如何执行terrafile
Terrafile 所在目录中的命令。
我的 azure.pipelines.yml 示例:
- script: curl -L https://github.com/coretech/terrafile/releases/download/v0.6/terrafile_0.6_Linux_x86_64.tar.gz | tar xz -C $(Agent.ToolsDirectory)
displayName: Install Terrafile
- script: |
cd $(Build.Repository.LocalPath)
$(Agent.ToolsDirectory)/terrafile
displayName: Download required modules