Terraform:我们如何才能仅在检测到修改时更新标签
Terraform: how can we update a tag only if modification is detected
我在我的 terraform 文件中实现了带有字段 Lastupdate 的标签,如下所示
问题是每当我应用我的 tf 文件时,这个字段总是更新,即使没有变化。我希望仅在检测到更改时才更新此标签。
你知道我怎样才能做到这一点吗?
我的代码看起来像
resource "azurerm_app_service_plan" "terra_app_plan" {
resource_group_name = azurerm_resource_group.terra_resource_group.name
location = azurerm_resource_group.terra_resource_group.location
name = local.app_serviceplan_name
sku {
size = var.app_serviceplan_size
tier = var.app_serviceplan_tiers
}
tags = local.common_tags
}
还有这里
locals {
common_tags = {
costcenter = var.cost_center
environment = terraform.workspace
lastupdate = formatdate("DD-MMM-YY hh:mm:ss ZZZ", timestamp())
}
也许我们可以为参数 lastupdate 添加一个条件项,但我不知道该怎么做
感谢大家
标签用于为您的资源的特定版本分配一个有意义的名称。标记是为特定保存创建的,即使您对资源进行了更改,它也不会更新。 重要的是,标记是 name-value 对,用于在 Azure Porta 中组织资源
无法通过 tag
检测资源中的最后更新,最好检查该特定资源的 Activiy 日志。
EDIT/CAUTION:我发现这种使用远程环境执行的方法存在问题,例如 Terraform Cloud。这在本地有效,但在目标文件在 运行 申请时间期间创建的情况下,最后修改日期基于在该 运行 时间期间创建的文件。
最佳做法是让标签有意义 key/values,如其他答案中所建议的那样。但是,如果您遇到此要求,一种方法是使用 Terraform external
数据资源来 运行 一个 shell 脚本,捕获日期,然后在您的 Terraform 中使用它作为您的标签的价值。
首先,在 Terraform 模块中创建一个 bash 脚本:
#!/bin/bash
LASTUPDATED=$(date -r )
echo '{"lastupdated":"'$LASTUPDATED'"}' | jq .
然后,在您的 Terraform 中,您可以使用结果来应用您的标签:
# so_71645084.tf
variable "costcenter" { default = "foo" }
data "external" "file_last_updated" {
program = ["bash", "${path.module}/so_71645084.sh", "${path.module}/so_71645084.tf"]
}
locals {
common_tags = {
costcenter = var.costcenter
environment = terraform.workspace
lastupdate = data.external.file_last_updated.result.lastupdated
}
}
output "common_tags" { value = local.common_tags }
您的 common_tags
输出将是:
...
+ costcenter = "foo"
+ environment = "dev"
+ lastupdate = "Mon Mar 28 13:32:15 UTC 2022"
总而言之,external
数据资源 运行 是针对您正在跟踪更改的目标文件的 date
命令。我们将结果用作 Terraform 中的数据资源,以将日期值应用于我们的标签。
我在我的 terraform 文件中实现了带有字段 Lastupdate 的标签,如下所示
问题是每当我应用我的 tf 文件时,这个字段总是更新,即使没有变化。我希望仅在检测到更改时才更新此标签。
你知道我怎样才能做到这一点吗?
我的代码看起来像
resource "azurerm_app_service_plan" "terra_app_plan" {
resource_group_name = azurerm_resource_group.terra_resource_group.name
location = azurerm_resource_group.terra_resource_group.location
name = local.app_serviceplan_name
sku {
size = var.app_serviceplan_size
tier = var.app_serviceplan_tiers
}
tags = local.common_tags
}
还有这里
locals {
common_tags = {
costcenter = var.cost_center
environment = terraform.workspace
lastupdate = formatdate("DD-MMM-YY hh:mm:ss ZZZ", timestamp())
}
也许我们可以为参数 lastupdate 添加一个条件项,但我不知道该怎么做
感谢大家
标签用于为您的资源的特定版本分配一个有意义的名称。标记是为特定保存创建的,即使您对资源进行了更改,它也不会更新。 重要的是,标记是 name-value 对,用于在 Azure Porta 中组织资源
无法通过 tag
检测资源中的最后更新,最好检查该特定资源的 Activiy 日志。
EDIT/CAUTION:我发现这种使用远程环境执行的方法存在问题,例如 Terraform Cloud。这在本地有效,但在目标文件在 运行 申请时间期间创建的情况下,最后修改日期基于在该 运行 时间期间创建的文件。
最佳做法是让标签有意义 key/values,如其他答案中所建议的那样。但是,如果您遇到此要求,一种方法是使用 Terraform external
数据资源来 运行 一个 shell 脚本,捕获日期,然后在您的 Terraform 中使用它作为您的标签的价值。
首先,在 Terraform 模块中创建一个 bash 脚本:
#!/bin/bash
LASTUPDATED=$(date -r )
echo '{"lastupdated":"'$LASTUPDATED'"}' | jq .
然后,在您的 Terraform 中,您可以使用结果来应用您的标签:
# so_71645084.tf
variable "costcenter" { default = "foo" }
data "external" "file_last_updated" {
program = ["bash", "${path.module}/so_71645084.sh", "${path.module}/so_71645084.tf"]
}
locals {
common_tags = {
costcenter = var.costcenter
environment = terraform.workspace
lastupdate = data.external.file_last_updated.result.lastupdated
}
}
output "common_tags" { value = local.common_tags }
您的 common_tags
输出将是:
...
+ costcenter = "foo"
+ environment = "dev"
+ lastupdate = "Mon Mar 28 13:32:15 UTC 2022"
总而言之,external
数据资源 运行 是针对您正在跟踪更改的目标文件的 date
命令。我们将结果用作 Terraform 中的数据资源,以将日期值应用于我们的标签。