【问题标题】:Unexpected error while passing variable group variables (Azure DevOps) to YAML pipeline将变量组变量 (Azure DevOps) 传递到 YAML 管道时出现意外错误
【发布时间】:2022-01-03 05:54:19
【问题描述】:

我是 Azure DevOps 和 Terraform 的新手,但我正在尝试使用 YAML 文件部署管道。

我尝试使用 YAML 文件并传递变量(来自 AZ DevOps)运行 terraform plan,但出现以下错误:

 
2021-11-24T18:39:46.4604561Z Error: "name" may only contain alphanumeric characters, dash, underscores, parentheses and periods
2021-11-24T18:39:46.4604832Z 
2021-11-24T18:39:46.4605940Z   on modules/aks/main.tf line 2, in resource "azurerm_resource_group" "aks-resource-group":
2021-11-24T18:39:46.4606436Z    2:   name     = var.resource_group_name
2021-11-24T18:39:46.4606609Z 
2021-11-24T18:39:46.4606722Z 
2021-11-24T18:39:46.4606818Z 
2021-11-24T18:39:46.4607525Z Error: Error: Subnet: (Name "#{vnet_subnet_name}#" / Virtual Network Name "#{vnet_name}#" / Resource Group "RG-XX-XXXX-XXXXX-001") was not found
2021-11-24T18:39:46.4608006Z 
2021-11-24T18:39:46.4608580Z   on modules/aks/main.tf line 16, in data "azurerm_subnet" "subnet-project":
2021-11-24T18:39:46.4609335Z   16: data "azurerm_subnet" "subnet-project" {

“名称”在 Azure DevOps UI 的变量组中具有以下格式:

RG-XX-XXXX-XXXXX-001

这是我在 YAML 文件中包含替换令牌的位置的 sn-p:

          displayName: 'Replace Secrets'
          inputs:
            targetFiles: |
              variables.tfvars
              encoding: 'utf-8'
            actionOnMissing: fail
            tokenPattern: #{MyVar}#

这是我在变量组中的变量示例: variable-group-sample

另外,我将terraform.tfvars 文件替换为如下内容:

resource_group_name   = "#{resource_group_name}#"

我已经检查了几次插入到 UI 中的名称,但我觉得错误指向我看不到的其他内容。

有没有人遇到过与此错误相关的问题?

提前谢谢你!

【问题讨论】:

    标签: azure-devops terraform azure-pipelines terraform-provider-azure azure-pipelines-yaml


    【解决方案1】:
    tokenPattern: #{MyVar}#
    

    它正在寻找要替换的模式#{MyVar}#。不是“包含在#{}# 之间的东西,而是实际值#{MyVar}#。我猜它需要一个正则表达式,但我不熟悉那个任务。

    所以最终结果是您的#{token values}# 没有被替换。

    假设您使用的是https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens,您可能希望指定tokenPrefix: #{tokenSuffix: }# 而不是使用tokenPattern

    现在,话虽如此......

    没有理由tfvars 文件上使用令牌替换。您应该为每个环境创建不同的 tfvars 文件,然后通过 -var-file 参数将 tfvars 文件传递​​给 Terraform。秘密可以通过-var 'foo=bar'在命令行中传入

    在 Azure DevOps(或 GitHub 或任何其他 CI 系统)中存储表示应用程序或部署配置的变量是一个很大的反模式,因为它会将您的部署过程与特定平台紧密耦合。如果您从 Azure DevOps 获取所有变量,您将无法轻松地在本地测试或迁移到其他 CI/CD 提供商,例如 GitHub Actions。

    对于不应在源代码控制中的值,例如机密,您应该使用像 Azure KeyVault 这样的机密提供程序并将其与您的应用程序集成(或者,在这种情况下,使用 Terraform 中的 data 资源来拉取在部署时自动获取必要的机密)。

    【讨论】:

    • 您好丹尼尔,感谢您的意见。我将再次检查该项目基础架构的最佳方法是什么。我会看看你所有的建议,以使用最佳实践。至于我提出的问题,您的回答解决了它。此外,tokenPattern: #{MyVar}# 部分也可以正常工作。我的错误是我调用错误的另一个变量。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多