2020-02-06 00:10:36 -08:00
< small > *[documentation ](/README.md#documentation ) / [Writing Policies ](/documentation/writing-policies.md ) / Generate Resources*</ small >
2019-05-21 15:50:36 -07:00
2020-05-28 11:22:47 -07:00
# Generating Resources
2019-05-21 15:50:36 -07:00
2020-02-07 10:21:47 -08:00
The ```generate` `` rule can used to create additional resources when a new resource is created. This is useful to create supporting resources, such as new role bindings for a new namespace.
The `generate` rule supports `match` and `exclude` blocks, like other rules. Hence, the trigger for applying this rule can be the creation of any resource and its possible to match or exclude API requests based on subjects, roles, etc.
2020-07-03 08:40:24 -07:00
The generate rule triggers during a API CREATE operation and does not support [background processing ](/documentation/writing-policies-background.md ). To keep resources synchronized across changes you can use `synchronize : true` .
2020-06-22 18:49:43 -07:00
2020-07-03 08:40:24 -07:00
This policy sets the Zookeeper and Kafka connection strings for all namespaces.
```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: "zk-kafka-address"
spec:
rules:
- name: "zk-kafka-address"
match:
resources:
kinds:
- Namespace
generate:
synchronize: true
kind: ConfigMap
name: zk-kafka-address
# generate the resource in the new namespace
namespace: "{{request.object.metadata.name}}"
data:
kind: ConfigMap
data:
ZK_ADDRESS: "192.168.10.10:2181,192.168.10.11:2181,192.168.10.12:2181"
KAFKA_ADDRESS: "192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092"
```
2019-05-21 15:50:36 -07:00
2019-06-03 16:02:34 -07:00
## Example 1
2020-02-06 22:51:16 -08:00
2019-05-22 18:14:10 +03:00
````yaml
2019-11-13 13:55:27 -08:00
apiVersion: kyverno.io/v1
2019-09-03 14:51:51 -07:00
kind: ClusterPolicy
2019-06-03 16:02:34 -07:00
metadata:
name: basic-policy
spec:
2019-05-22 18:14:10 +03:00
rules:
2020-01-07 15:13:57 -08:00
- name: "Generate ConfigMap"
2019-08-21 15:49:34 -07:00
match:
resources:
kinds:
- Namespace
2019-05-22 18:14:10 +03:00
generate:
2020-01-07 15:13:57 -08:00
kind: ConfigMap # Kind of resource
name: default-config # Name of the new Resource
2020-02-06 22:51:16 -08:00
namespace: "{{request.object.metadata.name}}" # namespace that triggers this rule
2020-06-22 18:49:43 -07:00
synchronize : true
2019-06-03 16:02:34 -07:00
clone:
2019-05-22 18:14:10 +03:00
namespace: default
name: config-template
2020-02-06 22:51:16 -08:00
- name: "Generate Secret (insecure)"
2019-08-21 15:49:34 -07:00
match:
resources:
kinds:
- Namespace
2019-06-03 16:02:34 -07:00
generate:
kind: Secret
2019-05-22 18:14:10 +03:00
name: mongo-creds
2020-02-06 22:51:16 -08:00
namespace: "{{request.object.metadata.name}}" # namespace that triggers this rule
2019-05-22 18:14:10 +03:00
data:
2019-06-03 16:02:34 -07:00
data:
DB_USER: YWJyYWthZGFicmE=
DB_PASSWORD: YXBwc3dvcmQ=
metadata:
labels:
purpose: mongo
2019-05-22 18:14:10 +03:00
````
2020-02-06 22:51:16 -08:00
In this example new namespaces will receive 2 new resources after its creation:
2020-04-02 22:28:09 -07:00
* A `ConfigMap` cloned from `default/config-template` .
* A `Secret` with values `DB_USER` and `DB_PASSWORD` , and label `purpose: mongo` .
2019-06-03 16:02:34 -07:00
2019-05-22 18:15:35 +03:00
2019-06-03 16:02:34 -07:00
## Example 2
````yaml
2019-11-13 13:55:27 -08:00
apiVersion: kyverno.io/v1
2019-09-03 14:51:51 -07:00
kind: ClusterPolicy
2019-06-03 16:02:34 -07:00
metadata:
name: "default"
spec:
rules:
- name: "deny-all-traffic"
2019-08-21 15:49:34 -07:00
match:
resources:
kinds:
- Namespace
name: "*"
2019-06-03 16:02:34 -07:00
generate:
kind: NetworkPolicy
name: deny-all-traffic
2020-02-06 22:51:16 -08:00
namespace: "{{request.object.metadata.name}}" # namespace that triggers this rule
2019-06-03 16:02:34 -07:00
data:
spec:
2020-02-07 12:03:53 -08:00
# select all pods in the namespace
podSelector: {}
policyTypes:
- Ingress
2019-06-03 16:02:34 -07:00
metadata:
labels:
policyname: "default"
````
2019-06-12 16:47:22 -07:00
2020-04-02 22:28:09 -07:00
In this example new namespaces will receive a `NetworkPolicy` that by default denies all inbound and outbound traffic.
2019-05-21 15:50:36 -07:00
2019-05-22 00:09:45 -07:00
---
2020-02-06 00:04:19 -08:00
< small > *Read Next >> [Variables ](/documentation/writing-policies-variables.md )*</ small >
2019-05-21 15:50:36 -07:00