开放策略代理定义动态全局变量

时间:2020-06-14 10:01:05

标签: terraform open-policy-agent rego

我想知道是否有任何方法可以美化我的代码,因为它看起来效率极低且完全不是DRY。我要实现的目标是从资源列表(从terraform计划中提取名为“ aks”的资源)中提取特定资源,并对它进行一些测试。问题是,我正在使用some关键字来获取它,这阻止了我配置全局变量,这会导致很多重复,例如:

aks_default_pool_type_vmss {
    some index
    input.planned_values.root_module.resources[index].type == "azurerm_kubernetes_cluster"
    aks := input.planned_values.root_module.resources[index]
    aks.values.default_node_pool[0].type == "VirtualMachineScaleSets"
}

aks_system_assigned_identity {
    some index
    input.planned_values.root_module.resources[index].type == "azurerm_kubernetes_cluster"
    aks := input.planned_values.root_module.resources[index]
    aks.values.identity[_].type == "SystemAssigned"
}

为了防止所有重新计算,是否有任何方法可以创建一个将捕获aks资源的“全局”变量?

干杯。

1 个答案:

答案 0 :(得分:1)

您可以创建一个规则,该规则创建一组aks对象(请参见生成sets in the OPA documentation):

clusters[aks] {
    some index
    input.planned_values.root_module.resources[index].type == "azurerm_kubernetes_cluster"
    aks := input.planned_values.root_module.resources[index]
}

然后您的规则可以将您的内容重写为以下内容:

aks_default_pool_type_vmss {
    aks := clusters[_]
    aks.values.default_node_pool[0].type == "VirtualMachineScaleSets"
}

aks_system_assigned_identity {
    aks := clusters[_]
    aks.values.identity[_].type == "SystemAssigned"
}