Golang Go语言中如何优雅的使用 opa 进行开发
Golang Go语言中如何优雅的使用 opa 进行开发
上文OPA-重新定义规则引擎-入门篇一个简单的例子介绍了OPA
如何使用。也提供了在线运行版代码供大家尝试。
本文趁热打铁,介绍如何优雅的使用opa
进行开发。
opa
opa
(命令行工具)现在迭代比较快,为了性能和一些丰富的内置函数,推荐使用最新版
# mac
curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_darwin_amd64
chmod +x opa
mv opa /usr/local/bin/opa
查看命令帮助
$ opa -h
An open source project to policy-enable your service.
Usage:
opa [command]
Available Commands:
build Compile Rego policy queries
check Check Rego source files
deps Analyze Rego query dependencies
eval Evaluate a Rego query
fmt Format Rego source files
help Help about any command
parse Parse Rego source file
run Start OPA in interactive or server mode
test Execute Rego test cases
version Print the version of OPA
看介绍能知道每个命令是干啥的,用到时具体看 help 就行
这里边挑常用的命令讲下:
run
opa run
是OPA
实现的交互式运行(REPL
)命令,本地学习或者调试会很方便
$ opa run quick-start
OPA 0.17.3 (commit 28ca58f3, built at 2020-03-03T18:07:55Z)
Run 'help' to see a list of commands.
> data #获取上下文
你会得到 json 格式的 data 下的所有节点内容
主要有两类,所有quick-start
目录下的
- 配置文件(
.json|.yaml|.yml
)
对应的父节点是data
Rego
文件(包括 test 文件)
对应的父节点是data.<package name>
Tips: 这样配置文件都挂在
data
这个根节点下了,如果想加载配置文件时增加父节点(如data.example.file
)该怎么办? 可以文件的路径映射前缀opa run example.file:quick-start
注意只会改变配置文件的父节点 这一点很有用,以后讲bundle
也会提到
当然也可以指定输入文件input
。这个比较特殊,命令行保留了包前缀repl.input
给input
也就是说,可以用repl.input:<path to input.json>
的方式传递输入,而避免挂载到data
根节点下
$ opa run quick-start repl.input:quick-start/input.json
> data.example_rbac
{
"allow": true,
"role_has_permission": [
"widget-reader"
],
"user_has_role": [
"widget-reader"
]
}
Tips:
-w
支持交互式窗口内实时文件变更 reload-s
支持服务常驻式启动,启动后可以 REST-Api 查询;
eval
opa eval
是用来查询策略结果
-d
指定上下文,-i
指定输入
-f
指定返回格式,默认 json,还支持values,bindings,pretty,source
opa eval -f values -d quick-start -i quick-start/input.json "data.example_rbac"
[
{
"allow": true,
"role_has_permission": [
"widget-reader"
],
"user_has_role": [
"widget-reader"
]
}
]
Tips: 还支持性能分析
--metrics
,--instrument
,--profile
deps
opa deps
用来分析查询依赖
$ opa deps -d quick-start "data.example_rbac"
+------------------------+---------------------------------------+
| BASE DOCUMENTS | VIRTUAL DOCUMENTS |
+------------------------+---------------------------------------+
| data.bindings | data.example_rbac.allow |
| data.roles | data.example_rbac.role_has_permission |
| input.action.operation | data.example_rbac.user_has_role |
| input.action.resource | |
| input.subject.user | |
+------------------------+---------------------------------------+
test
opa test
用来跑测试,-c
支持输出覆盖率,--threshold
可指定通过覆盖率
check & fmt
opa check
是语法检查;opa fmt
是格式化
vscode-opa
命令虽少可还是要记啊,有没有不用敲命令这么费劲的
有!官方强大的交互式编辑器扩展vscode-opa,了解下~~
安装后只要在vscode
的配置里指定OPA
执行文件路径就可以用了
"opa.path": "/usr/local/bin/opa"
功能
它基本支持上述大部分命令功能:
- 在保存时检查语法( Check Syntax on Save )
- 计算包结果( Evaluate Packages )
- 计算选择部分结果( Evaluate Selections )
- 部分评估选择( Partially Evaluate Selections )
- 对选择部分代码运行追踪( Trace Selections )
- 对选择部分性能分析( Profile Selections )
- 在工作区中运行测试( Run Tests in Workspace )
- 切换工作区的测试覆盖( Toggle Coverage in Workspace )
- 切换选择部分的测试覆盖( Toggle Coverage of Selections )
其中评估(Evaluate
)和测试覆盖显示(Coverage
)在日常开发中很实用
具体如下图:
快捷键配置
这里可以配置用户快捷键方便直接调起命令:
(官方推荐的前两个Evaluate
的,后边Test
相关的也可以加上)
[
{
"key": "cmd+e",
"command": "opa.eval.selection",
"when": "editorLangId == rego"
},
{
"key": "shift+cmd+a",
"command": "opa.eval.package",
"when": "editorLangId == rego"
},
{
"key": "shift+cmd+c",
"command": "opa.test.coverage.workspace",
"when": "editorLangId == rego"
},
{
"key": "shift+cmd+t",
"command": "opa.test.workspace",
"when": "editorLangId == rego"
},
]
Tip: 插件默认只取项目根目录的
input.json
作为输入 配置opa.bundleMode
默认为 true,则会只获取目录里的所有data.{json|yaml}
如果设置为 false,则会获取目录中所有.{json|yaml}
好了,现在可以优雅的使用opa
开发了。
下一篇我们来讲讲OPA
的函数和虚拟文档,了解下他们各自适用的场景。
本文代码详见:NewbMiao/opa-koans
文章首发公众号:newbmiao, 欢迎关注获取及时更新
推荐阅读:OPA 系列
更多关于Golang Go语言中如何优雅的使用 opa 进行开发的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang Go语言中如何优雅的使用 opa 进行开发的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中优雅地使用OPA(Open Policy Agent)进行开发,可以遵循以下几个步骤和建议:
-
安装与配置OPA: 首先,确保你已经安装了OPA CLI工具。你可以通过官方文档获取安装指南。安装完成后,初始化一个OPA项目,配置好必要的环境变量和路径。
-
定义策略: 使用Rego语言编写你的策略文件。Rego是OPA专用的策略语言,易于编写和理解。将策略文件保存在项目的特定目录下,便于管理和版本控制。
-
集成OPA客户端: 在Go项目中,引入OPA的Go客户端库。通过该库,你可以轻松地将OPA策略集成到你的Go应用中。确保你的
go.mod
文件中包含了相应的依赖。 -
数据输入与决策: 编写代码将相关数据输入到OPA中,并调用OPA进行策略评估。利用OPA的API,你可以将查询和决策请求发送到OPA服务器,获取评估结果。
-
错误处理与日志: 在集成过程中,添加适当的错误处理和日志记录。这有助于在策略评估失败或数据问题时进行调试和追踪。
-
持续集成与测试: 将OPA策略测试纳入你的持续集成流程。编写单元测试来验证策略的正确性,确保在代码变更时策略仍然有效。
-
文档与培训: 为团队提供关于OPA和Rego的文档和培训,确保每个人都了解如何编写、测试和部署策略。
遵循这些步骤,你可以在Go项目中优雅地集成和使用OPA,实现强大的策略管理和决策能力。