Open Policy Agent(OPA) 【2】rego 语法

2023-10-30 03:30
文章标签 语法 open agent policy opa rego

本文主要是介绍Open Policy Agent(OPA) 【2】rego 语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Open Policy Agent(OPA) rego 语法

tags: OPA

文章目录

  • Open Policy Agent(OPA) rego 语法
    • 1. 背景
    • 2. 什么是rego
    • 3. 为什么使用rego
    • 4. 语法
      • 4.1 基础知识
      • 4.2 标量值
      • 4.3 综合值
      • 4.4 对象
      • 4.5 Sets
      • 4.6 Variables
      • 4.7 References
      • 4.8 Keys
      • 4.9 Composite Keys
      • 4.10 Array Comprehensions
      • 4.11 Set Comprehensions


  • Open Policy Agent(OPA) 【1】介绍
  • Open Policy Agent(OPA) 【2】rego语法
  • Open Policy Agent(OPA) 【3】实战
  • 云原生圣经

在这里插入图片描述

1. 背景

OPA专门用于推理结构化文档中表示的信息。您的服务及其用户发布的数据可以使用OPA的本机查询语言Rego进行检查和转换。

2. 什么是rego

Rego受到Datalog的启发,Datalog是一种众所周知的数十年的查询语言。Rego扩展了Datalog以支持诸如JSON之类的结构化文档模型。

Rego查询是对存储在OPA中的数据的断言。这些查询可用于定义策略,该策略枚举违反系统预期状态的数据实例

3. 为什么使用rego

使用Rego定义易于阅读和编写的策略。

Rego致力于为引用嵌套文档提供强大的支持,并确保查询正确无误。

Rego是声明性的,因此策略作者可以专注于应返回的查询,而不是应如何执行查询。这些查询比命令式语言中的查询更简单,更简洁。

像其他支持声明性查询语言的应用程序一样,OPA能够优化查询以提高性能。

4. 语法

4.1 基础知识

pi := 3.14159
pi
3.14159rect := {"width": 2, "height": 4}
rect
{"height": 4,"width": 2
}rect == {"height": 4, "width": 2}
truev { "hello" == "world" }
undefined decision
v == true
undefined decision
v != true
undefined decision

根据变量来定义规则
规则本身可以直观地理解为:

rule-name IS value IF body

示例:

t { x := 42; y := 41; x > y }
t
truet2 {x := 42y := 41x > y
}

规则中的表达式顺序不会影响文档的内容。

s {x > yy = 41x = 42
}
s
true

有一个例外:如果使用赋值:=,编译器将检查所赋值的变量是否尚未使用。

z {y := 41y := 4243 > y
}
1 error occurred: module.rego:5: rego_compile_error: var y assigned above
sites = [{"name": "prod"}, {"name": "smoke1"}, {"name": "dev"}]
r { sites[_].name == "prod" }

上述规则r断言sites该name属性等于的地方(至少)存在一个文档"prod"。

结果:true

我们可以使用定义集合文档而不是布尔文档的规则来概括上面的示例:

q[name] { name := sites[_].name }
["prod","smoke1","dev"
]p { q["prod"] }
查询p将具有相同的结果:
trueq["smoke2"]
undefined decision

4.2 标量值

标量值是Rego中最简单的术语类型。标量值可以是字符串,数字,布尔值或null。

可以仅根据标量值定义文档。这对于定义在多个位置引用的常量很有用。例如:

greeting   := "Hello"
max_height := 42
pi         := 3.14159
allowed    := true
location   := null[greeting, max_height, pi, allowed, location]
["Hello",42,3.14159,true,null
]

4.3 综合值

cube := {"width": 3, "height": 4, "depth": 5}cube.width
3a := 42
b := false
c := null
d := {"a": a, "x": [b, c]}+----+-------+------+---------------------------+
| a  |   b   |  c   |             d             |
+----+-------+------+---------------------------+
| 42 | false | null | {"a":42,"x":[false,null]} |
+----+-------+------+---------------------------+

4.4 对象

对象是无序键值集合。在Rego中,任何值类型都可以用作对象键。例如,以下分配将端口号映射 到IP地址列表(表示为字符串)。

ips_by_port := {80: ["1.1.1.1", "1.1.1.2"],443: ["2.2.2.1"],
}ips_by_port[80]
["1.1.1.1","1.1.1.2"
]some port; ips_by_port[port][_] == "2.2.2.1"
+------+
| port |
+------+
| 443  |
+------+将Rego值转换为JSON时,会将非字符串对象键编组为字符串(因为JSON不支持非字符串对象键)。
ips_by_port
{"443": ["2.2.2.1"],"80": ["1.1.1.1","1.1.1.2"]
}

4.5 Sets

除了数组和对象外,Rego还支持设置值。集是唯一值的无序集合。就像其他复合值一样,可以根据标量,变量,引用和其他复合值来定义集合。例如:

s := {cube.width, cube.height, cube.depth}
+---------+
|    s    |
+---------+
| [5,4,3] |
+---------+

设置文档是没有键的值的集合。当序列化为JSON或不支持集合数据类型的其他格式时,OPA将集合文档表示为数组。集与数组或对象之间的重要区别在于,对集和数组或对象进行键控时,它们是无键的,即,您不能引用集内元素的索引。

比较集合时,元素的顺序无关紧要:

{1,2,3} == {3,1,2}
true{1,2,3} == {3,x,2}
1 error occurred: 1:1: rego_unsafe_var_error: var x is unsafe

因为集合与对象共享大括号语法,并且使用定义了一个空对象{},所以必须使用不同的语法来构造一个空集合:

count(set())
0

4.6 Variables

变量是Rego中的另一种术语。它们同时出现在规则的开头和正文中。

可以将出现在规则开头的变量视为规则的输入和输出。与许多编程语言不同,变量是输入或输出,而在许多编程语言中,变量同时是输入和输出。如果查询提供变量的值,则该变量为输入,如果查询不提供变量的值,则该变量为输出。

sites := [{"name": "prod"},{"name": "smoke1"},{"name": "dev"}
]q[name] { name := sites[_].name }q[x]
+----------+----------+
|    x     |   q[x]   |
+----------+----------+
| "prod"   | "prod"   |
| "smoke1" | "smoke1" |
| "dev"    | "dev"    |
+----------+----------+q["dev"]
"dev"

4.7 References

引用用于访问嵌套文档。

本节中的示例使用“示例”部分中定义的数据。

最简单的参考不包含任何变量。例如,以下参考从示例数据中返回第一个站点文档中第二个服务器的主机名:

sites[0].servers[1].hostname
"helium"

4.8 Keys

引用可以包含变量作为键。以这种方式编写的引用用于从集合中的每个元素中选择一个值。

以下参考将在示例数据中选择所有服务器的主机名:

sites[i].servers[j].hostname
+---+---+------------------------------+
| i | j | sites[i].servers[j].hostname |
+---+---+------------------------------+
| 0 | 0 | "hydrogen"                   |
| 0 | 1 | "helium"                     |
| 0 | 2 | "lithium"                    |
| 1 | 0 | "beryllium"                  |
| 1 | 1 | "boron"                      |
| 1 | 2 | "carbon"                     |
| 2 | 0 | "nitrogen"                   |
| 2 | 1 | "oxygen"                     |
+---+---+------------------------------+

从概念上讲,这与以下命令式(Python)代码相同:

def hostnames(sites):result = []for site in sites:for server in site.servers:result.append(server.hostname)return result

在上面的参考中,我们有效地使用了名为i和的变量j来迭代集合。如果变量在引用外部未使用,我们更喜欢用下划线(_)字符替换它们。上面的参考可以重写为:

sites[_].servers[_].hostname
+------------------------------+
| sites[_].servers[_].hostname |
+------------------------------+
| "hydrogen"                   |
| "helium"                     |
| "lithium"                    |
| "beryllium"                  |
| "boron"                      |
| "carbon"                     |
| "nitrogen"                   |
| "oxygen"                     |
+------------------------------+

4.9 Composite Keys

s := {[1, 2], [1, 4], [2, 6]}
s[[1, 2]]
[1,2
]s[[1, x]]
+---+-----------+
| x | s[[1, x]] |
+---+-----------+
| 2 | [1,2]     |
| 4 | [1,4]     |
+---+-----------+

4.10 Array Comprehensions

数组推导从子查询中构建数组值。数组推导具有以下形式:

[ <term> | <body> ]

例如,以下规则定义一个对象,其中的键是应用程序名称,值是在其中部署应用程序的服务器的主机名。服务器的主机名以数组表示。

app_to_hostnames[app_name] = hostnames {app := apps[_]app_name := app.namehostnames := [hostname | name := app.servers[_]s := sites[_].servers[_]s.name == namehostname := s.hostname]
}结果
app_to_hostnames[app]
+-----------+------------------------------------------------------+
|    app    |                app_to_hostnames[app]                 |
+-----------+------------------------------------------------------+
| "web"     | ["hydrogen","helium","beryllium","boron","nitrogen"] |
| "mysql"   | ["lithium","carbon"]                                 |
| "mongodb" | ["oxygen"]                                           |
+-----------+------------------------------------------------------+

4.11 Set Comprehensions

Set Comprehensions从子查询中构建设置值。集合理解的形式为

{ <term> | <body> }a := [1, 2, 3, 4, 3, 4, 3, 4, 5]
b := {x | x = a[_]}+---------------------+-------------+
|          a          |      b      |
+---------------------+-------------+
| [1,2,3,4,3,4,3,4,5] | [1,2,3,4,5] |
+---------------------+-------------+

参考:

  • OPA policy-language rego
  • OPA Gatekeeper: Policy and Governance for Kubernetes
  • Kubernetes Admission Control OPA
  • OPA On Kubernetes: An Introduction For Beginners

这篇关于Open Policy Agent(OPA) 【2】rego 语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305310

相关文章

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

Open a folder or workspace... (File -> Open Folder)

问题:vscode Open with Live Server 时 显示Open a folder or workspace... (File -> Open Folder)报错 解决:不可以单独打开文件1.html ; 需要在文件夹里打开 像这样

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

python基础语法十一-赋值、浅拷贝、深拷贝

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作Excel python基础语法八-异常 python基础语法九-多进程和多线程 python基础语法十-文件和目录操作