1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-09 01:16:55 +00:00
kyverno/documentation/writing-policies-configmap-reference.md

94 lines
3.1 KiB
Markdown
Raw Normal View History

<small>*[documentation](/README.md#documentation) / [Writing Policies](/documentation/writing-policies.md) / Configmap Lookup*</small>
2020-10-01 00:32:12 -07:00
# Using ConfigMaps for Variables
2020-10-01 00:32:12 -07:00
There are many cases where the values that are passed into Kyverno policies are dynamic or need to be vary based on the execution environment.
2020-10-01 00:32:12 -07:00
Kyverno supports using Kubernetes [ConfigMaps](https://kubernetes.io/docs/concepts/configuration/configmap/) to manage variable values outside of a policy definition.
2020-10-01 00:32:12 -07:00
# Defining ConfigMaps in a Rule Context
2020-10-01 00:32:12 -07:00
To refer to values from a ConfigMap inside any Rule, define a context inside the rule with one or more ConfigMap declarations.
2020-09-22 18:28:21 -07:00
````yaml
rules:
2020-09-22 18:28:21 -07:00
- name: example-configmap-lookup
# added context to define the configmap information which will be referred
context:
# unique name to identify configmap
2020-09-22 18:28:21 -07:00
- name: dictionary
configMap:
# configmap name - name of the configmap which will be referred
name: mycmap
# configmap namepsace - namespace of the configmap which will be referred
2020-09-22 18:28:21 -07:00
namespace: test
````
2020-10-01 00:32:12 -07:00
Sample ConfigMap Definition
2020-09-22 18:28:21 -07:00
````yaml
apiVersion: v1
data:
2020-09-22 18:28:21 -07:00
env: production
kind: ConfigMap
metadata:
name: mycmap
2020-09-22 18:28:21 -07:00
````
2020-10-01 00:32:12 -07:00
# Looking up values
2020-10-01 00:32:12 -07:00
A ConfigMap that is defined in a rule context can be referred to using its unique name within the context. ConfigMap values can be referenced using a JMESPATH style expression `{{<name>.<data>.<key>}}`.
2020-10-01 00:32:12 -07:00
For the example above, we can refer to a ConfigMap value using `{{dictionary.data.env}}`. The variable will be substituted with the value `production` during policy execution.
2020-09-22 19:54:41 -07:00
# Handling Array Values
2020-09-22 19:54:41 -07:00
The ConfigMap value can be an array of string values in JSON format. Kyverno will parse the JSON string to a list of strings, so set operations like In and NotIn can then be applied.
2020-09-22 18:28:21 -07:00
2020-10-01 00:32:12 -07:00
For example, a list of allowed roles can be stored in a ConfigMap, and the Kyverno policy can refer to this list to deny the requests where the role does not match one of the values in the list.
Here are the allowed roles in the ConfigMap:
2020-09-22 18:28:21 -07:00
````yaml
apiVersion: v1
data:
allowed-roles: "[\"cluster-admin\", \"cluster-operator\", \"tenant-admin\"]"
kind: ConfigMap
metadata:
name: roles-dictionary
namespace: test
````
2020-10-01 00:32:12 -07:00
Here is a rule to block a Deployment if the value of annotation `role` is not in the allowed list:
2020-09-22 18:28:21 -07:00
````yaml
spec:
validationFailureAction: enforce
rules:
- name: validate-role-annotation
context:
- name: roles-dictionary
configMap:
name: roles-dictionary
namespace: test
match:
resources:
kinds:
- Deployment
preconditions:
- key: "{{ request.object.metadata.annotations.role }}"
operator: NotEquals
value: ""
validate:
message: "role {{ request.object.metadata.annotations.role }} is not in the allowed list {{ \"roles-dictionary\".data.\"allowed-roles\" }}"
deny:
conditions:
- key: "{{ request.object.metadata.annotations.role }}"
operator: NotIn
value: "{{ \"roles-dictionary\".data.\"allowed-roles\" }}"
````
<small>*Read Next >> [Testing Policies](/documentation/testing-policies.md)*</small>