OPA是否可以单独检查所有规则,或者这些规则必须合并到一个父规则中才能做出决定?



我正在尝试将OPA/开放策略代理/集成到gitlab ci-cd作业中,并根据地形计划输出对其进行评估。我在rego文件中有独立的规则,并希望从包级别运行它们中的每一个,以便opa输出具有truefalse结果的每个规则。此外,一旦OPA面对undefined/false结果,它将输出非零代码以及结果输出,以便gitlab ci意识到失败或成功的工作。有可能用OPA cli吗?

在某些规则失效的情况下rules.rego

package play.terraform
passing_rule{
1 = 1
}
failing_rule{
1 = 0
}

命令opa eval 'data.play.terraform' --data rules.rego --fail的输出和退出码为零

{"result":[{"expressions":
[{"value":{"passing_rule":true},
"text":"data.play.terraform",
"location":{"row":1,"col":1}
}]
}]}

这些规则是否必须合并成一个规则,并且该规则必须评估输出单个true or false输出?

计算包将永远不会呈现未定义,所以如果单独使用opa eval,您将不得不更具创造性。由于您希望捕获失败,因此您将希望使用默认值,因为OPA无法区分未定义的结果和根本不存在的规则。所以你可以像这样更新你的策略:

tf.rego

package play.terraform
default passing_rule := false
default failing_rule := false
passing_rule{
1 == 1
}
failing_rule{
1 == 0
}

然后创建一个"main"包,它将评估其他包。此模式称为动态策略组合:

main.rego

package main
import future.keywords.every
import future.keywords.in
import data.play.terraform
all_passed {
# Silly comprehension to print each result
[rule |
some rule, result in terraform
print(sprintf("%s: %s", [rule, result]))
]
every result in terraform {
result == true
}
}

为了打印terraform包中每个规则的结果,我们在打印结果时使用一个推导式循环遍历它们。最后,我们使用every来确定规则本身是否应该求值,在这种情况下,它将使--fail返回退出代码为1。

$ opa eval --fail -f pretty -d tf.rego -d main.rego data.main.all_passed
failing_rule: false
passing_rule: true
undefined
$ echo $?
1

有点做作,但还是完成了任务:)

最新更新