173 lines
5.7 KiB
YAML
173 lines
5.7 KiB
YAML
---
|
|
- name: Create OPA namespace
|
|
kubernetes.core.k8s:
|
|
state: present
|
|
definition:
|
|
apiVersion: v1
|
|
kind: Namespace
|
|
metadata:
|
|
name: "{{ opa_server_namespace }}"
|
|
|
|
- name: Create OPA policy ConfigMap
|
|
kubernetes.core.k8s:
|
|
state: present
|
|
apply: true
|
|
definition:
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: "{{ opa_server_name }}-policies"
|
|
namespace: "{{ opa_server_namespace }}"
|
|
data: >-
|
|
{{ __opa_server_policies
|
|
| combine({'aap_policy_config.json': {'aap_policy_config': opa_server_policy_config} | to_json}) }}
|
|
|
|
- name: Create OPA authorization token Secret
|
|
kubernetes.core.k8s:
|
|
state: present
|
|
definition:
|
|
apiVersion: v1
|
|
kind: Secret
|
|
metadata:
|
|
name: "{{ opa_server_name }}-authz"
|
|
namespace: "{{ opa_server_namespace }}"
|
|
type: Opaque
|
|
stringData:
|
|
opa_authz.json: "{{ {'opa_authz': {'token': __opa_server_token}} | to_json }}"
|
|
no_log: "{{ opa_server_no_log }}"
|
|
|
|
- name: Create OPA Service with a service-ca serving certificate
|
|
kubernetes.core.k8s:
|
|
state: present
|
|
definition:
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: "{{ opa_server_name }}"
|
|
namespace: "{{ opa_server_namespace }}"
|
|
annotations:
|
|
service.beta.openshift.io/serving-cert-secret-name: "{{ __opa_server_tls_secret }}"
|
|
spec:
|
|
selector:
|
|
app: "{{ opa_server_name }}"
|
|
ports:
|
|
- name: https
|
|
port: "{{ opa_server_port | int }}"
|
|
targetPort: https
|
|
|
|
- name: Wait for OPA serving certificate
|
|
kubernetes.core.k8s_info:
|
|
api_version: v1
|
|
kind: Secret
|
|
namespace: "{{ opa_server_namespace }}"
|
|
name: "{{ __opa_server_tls_secret }}"
|
|
register: __opa_server_cert
|
|
until: __opa_server_cert.resources | length > 0
|
|
retries: 30
|
|
delay: 10
|
|
no_log: true
|
|
|
|
- name: Create OPA Deployment
|
|
kubernetes.core.k8s:
|
|
state: present
|
|
definition:
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: "{{ opa_server_name }}"
|
|
namespace: "{{ opa_server_namespace }}"
|
|
labels:
|
|
app: "{{ opa_server_name }}"
|
|
spec:
|
|
replicas: "{{ opa_server_replicas | int }}"
|
|
selector:
|
|
matchLabels:
|
|
app: "{{ opa_server_name }}"
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: "{{ opa_server_name }}"
|
|
annotations:
|
|
# Roll pods when policies, config, or the token change
|
|
checksum/policies: "{{ (__opa_server_policies | to_json ~ opa_server_policy_config | to_json) | hash('sha256') }}"
|
|
checksum/authz: "{{ __opa_server_token | hash('sha256') }}"
|
|
spec:
|
|
securityContext:
|
|
runAsNonRoot: true
|
|
seccompProfile:
|
|
type: RuntimeDefault
|
|
containers:
|
|
- name: opa
|
|
image: "{{ opa_server_image }}"
|
|
args: >-
|
|
{{ [
|
|
'run', '--server',
|
|
'--addr=0.0.0.0:' ~ opa_server_port,
|
|
'--tls-cert-file=/certs/tls.crt',
|
|
'--tls-private-key-file=/certs/tls.key',
|
|
'--authentication=token',
|
|
'--authorization=basic',
|
|
'--ignore=.*',
|
|
'--log-format=json',
|
|
'--log-level=' ~ opa_server_log_level,
|
|
]
|
|
+ (['--set=decision_logs.console=true'] if opa_server_decision_logs | bool else [])
|
|
+ ['/policies', '/authz'] }}
|
|
ports:
|
|
- name: https
|
|
containerPort: "{{ opa_server_port | int }}"
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: https
|
|
scheme: HTTPS
|
|
initialDelaySeconds: 3
|
|
periodSeconds: 10
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: https
|
|
scheme: HTTPS
|
|
initialDelaySeconds: 10
|
|
periodSeconds: 20
|
|
resources: "{{ opa_server_resources }}"
|
|
securityContext:
|
|
allowPrivilegeEscalation: false
|
|
readOnlyRootFilesystem: true
|
|
capabilities:
|
|
drop: [ALL]
|
|
volumeMounts:
|
|
- name: policies
|
|
mountPath: /policies
|
|
readOnly: true
|
|
- name: authz
|
|
mountPath: /authz
|
|
readOnly: true
|
|
- name: certs
|
|
mountPath: /certs
|
|
readOnly: true
|
|
volumes:
|
|
- name: policies
|
|
configMap:
|
|
name: "{{ opa_server_name }}-policies"
|
|
- name: authz
|
|
secret:
|
|
secretName: "{{ opa_server_name }}-authz"
|
|
- name: certs
|
|
secret:
|
|
secretName: "{{ __opa_server_tls_secret }}"
|
|
|
|
- name: Wait for OPA to be available
|
|
kubernetes.core.k8s_info:
|
|
api_version: apps/v1
|
|
kind: Deployment
|
|
namespace: "{{ opa_server_namespace }}"
|
|
name: "{{ opa_server_name }}"
|
|
register: __opa_server_deploy
|
|
until: >-
|
|
__opa_server_deploy.resources | length > 0 and
|
|
(__opa_server_deploy.resources[0].status.updatedReplicas | default(0)) == opa_server_replicas | int and
|
|
(__opa_server_deploy.resources[0].status.availableReplicas | default(0)) == opa_server_replicas | int
|
|
retries: "{{ __opa_server_wait_retries }}"
|
|
delay: 10
|