Updates Kuberef to use BMRA v21.08
[kuberef.git] / sw_config / bmra / patched_cmk_build.yml
1 # SPDX-FileCopyrightText: 2021 Intel Corporation.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4
5 ---
6 - name: install dependencies
7   include_role:
8     name: install_dependencies
9
10 - name: clone CMK repository
11   git:
12     repo: "{{ cmk_git_url }}"
13     dest: "{{ cmk_dir }}"
14     version: "{{ cmk_version }}"
15     force: yes
16
17 - name: patch CMK dockerfile (1/3)
18   lineinfile:
19     path: "{{ cmk_dir }}/Dockerfile"
20     regexp: '^FROM clearlinux'
21     line: 'FROM centos/python-36-centos7:latest'
22
23 - name: patch CMK dockerfile (2/3)
24   lineinfile:
25     path: "{{ cmk_dir }}/Dockerfile"
26     insertafter: '^FROM centos'
27     line: 'USER root'
28     state: present
29
30 - name: patch CMK dockerfile (3/3)
31   lineinfile:
32     path: "{{ cmk_dir }}/Dockerfile"
33     state: absent
34     regexp: '^RUN swupd'
35
36 - name: build CMK image
37   make:
38     chdir: "{{ cmk_dir }}"
39   when: container_runtime == "docker"
40
41 # NOTE(przemeklal): this fixes problem in CMK with ImagePullPolicy hardcoded to Never and the pod is scheduled on controller node
42 - name: tag CMK image
43   command: docker tag cmk:{{ cmk_img_version }} {{ registry_local_address }}/cmk:{{ cmk_img_version }}
44   changed_when: true
45   when: container_runtime == "docker"
46
47 - name: push CMK image to local registry
48   command: docker push {{ registry_local_address }}/cmk:{{ cmk_img_version }}
49   changed_when: true
50   when:
51     - container_runtime == "docker"
52     - inventory_hostname == groups['kube-node'][0]
53
54 - name: build and tag CMK image
55   command: podman build -f Dockerfile -t {{ registry_local_address }}/cmk:{{ cmk_img_version }}
56   args:
57     chdir: "{{ cmk_dir }}"
58   changed_when: true
59   when: '"docker" not in container_runtime'
60
61 - name: push CMK image to local registry
62   command: podman push {{ registry_local_address }}/cmk:{{ cmk_img_version }}
63   changed_when: true
64   when:
65     - inventory_hostname == groups['kube-node'][0]
66     - '"docker" not in container_runtime'
67
68 - name: clean up any pre-existing certs/key/CSR files
69   file: path=/etc/ssl/cmk state=absent
70   when: inventory_hostname == groups['kube-master'][0]
71   failed_when: false
72   become: yes
73
74 - name: delete any pre-existing certs/key/CSR from Kubernetes
75   command: kubectl delete csr cmk-webhook-{{ item }}.{{ cmk_namespace }}
76   when: inventory_hostname == groups['kube-master'][0]
77   failed_when: false
78   with_items:
79     - "client"
80     - "server"
81
82 - name: create directory for CMK cert and key generation
83   become: yes
84   file:
85     path: /etc/ssl/cmk
86     state: directory
87     mode: 0700
88     owner: root
89     group: root
90
91 - name: populate CMK CSR template
92   template:
93     src: "webhook_{{ item }}_csr.json.j2"
94     dest: "/etc/ssl/cmk/cmk-webhook-{{ item }}-csr.json"
95     force: yes
96     mode: preserve
97   become: yes
98   with_items:
99     - "client"
100     - "server"
101   when:
102     - inventory_hostname == groups['kube-master'][0]
103
104 - name: get GOPATH
105   command: go env GOPATH
106   register: gopath
107   when:
108     - inventory_hostname == groups['kube-master'][0]
109
110 - name: generate key and CSR
111   shell: "set -o pipefail \
112          && {{ gopath.stdout }}/bin/cfssl genkey cmk-webhook-{{ item }}-csr.json | {{ gopath.stdout }}/bin/cfssljson -bare cmk-webhook-{{ item }}"
113   args:
114     chdir: "/etc/ssl/cmk/"
115     executable: /bin/bash
116   with_items:
117     - "client"
118     - "server"
119   when:
120     - inventory_hostname == groups['kube-master'][0]
121   become: yes
122
123 - name: read generated server key
124   command: cat cmk-webhook-server-key.pem
125   args:
126     chdir: "/etc/ssl/cmk/"
127   register: server_key
128   when:
129     - inventory_hostname == groups['kube-master'][0]
130
131 - name: read generated client key
132   command: cat cmk-webhook-client-key.pem
133   args:
134     chdir: "/etc/ssl/cmk/"
135   register: client_key
136   when:
137     - inventory_hostname == groups['kube-master'][0]
138
139 - name: load generated server key
140   set_fact:
141     cmk_webhook_server_key: "{{ server_key.stdout | b64encode }}"
142   when:
143     - inventory_hostname == groups['kube-master'][0]
144
145 - name: load generated client key
146   set_fact:
147     cmk_webhook_client_key: "{{ client_key.stdout | b64encode }}"
148   when:
149     - inventory_hostname == groups['kube-master'][0]
150
151 - name: read generated client csr
152   command: cat cmk-webhook-client.csr
153   args:
154     chdir: "/etc/ssl/cmk/"
155   register: client_csr
156   when:
157     - inventory_hostname == groups['kube-master'][0]
158
159 - name: load generated client csr
160   set_fact:
161     cmk_webhook_client_csr: "{{ client_csr.stdout | b64encode }}"
162   when:
163     - inventory_hostname == groups['kube-master'][0]
164
165 - name: read generated server csr
166   command: cat cmk-webhook-server.csr
167   args:
168     chdir: "/etc/ssl/cmk/"
169   register: server_csr
170   when:
171     - inventory_hostname == groups['kube-master'][0]
172
173 - name: load generated server csr
174   set_fact:
175     cmk_webhook_server_csr: "{{ server_csr.stdout | b64encode }}"
176   when:
177     - inventory_hostname == groups['kube-master'][0]
178
179 - name: populate CMK Kubernetes CA CSR template
180   template:
181     src: "kube_{{ item }}_csr.yml.j2"
182     dest: "/etc/ssl/cmk/cmk-webhook-kube-{{ item }}-csr.yml"
183     force: yes
184     mode: preserve
185   with_items:
186     - "client"
187     - "server"
188   when:
189     - inventory_hostname == groups['kube-master'][0]
190
191 - name: send CSR to the Kubernetes API Server
192   command: kubectl apply -f /etc/ssl/cmk/cmk-webhook-kube-{{ item }}-csr.yml
193   with_items:
194     - "client"
195     - "server"
196   when:
197     - inventory_hostname == groups['kube-master'][0]
198
199 - name: approve request
200   command: kubectl certificate approve cmk-webhook-{{ item }}.{{ cmk_namespace }}
201   with_items:
202     - "client"
203     - "server"
204   when:
205     - inventory_hostname == groups['kube-master'][0]
206
207 - name: get approved server certificate
208   shell: kubectl get csr cmk-webhook-server.{{ cmk_namespace }} -o jsonpath='{.status.certificate}'
209   args:
210     chdir: "/etc/ssl/cmk/"
211   register: server_cert
212   when:
213     - inventory_hostname == groups['kube-master'][0]
214   retries: 30
215   delay: 1
216   until: server_cert.rc == 0
217
218 - name: get approved client certificate
219   shell: kubectl get csr cmk-webhook-client.{{ cmk_namespace }} -o jsonpath='{.status.certificate}'
220   args:
221     chdir: "/etc/ssl/cmk/"
222   register: client_cert
223   when:
224     - inventory_hostname == groups['kube-master'][0]
225   retries: 30
226   delay: 1
227   until: client_cert.rc == 0
228
229 - name: load generated server cert
230   set_fact:
231     cmk_webhook_server_cert: "{{ server_cert.stdout }}"
232   when:
233     - inventory_hostname == groups['kube-master'][0]
234
235 - name: load generated client cert
236   set_fact:
237     cmk_webhook_client_cert: "{{ client_cert.stdout }}"
238   when:
239     - inventory_hostname == groups['kube-master'][0]
240
241 - name: populate cmk-webhook.conf file
242   template:
243     src: "cmk-webhook.conf.j2"
244     dest: "/etc/kubernetes/admission-control/cmk-webhook.conf"
245     force: yes
246     mode: preserve
247   when:
248     - inventory_hostname == groups['kube-master'][0]
249
250 - name: add MutatingAdmissionWebhook to AdmissionConfiguration
251   blockinfile:
252     path: /etc/kubernetes/admission-control/config.yaml
253     insertafter: "plugins:"
254     block: |
255       - name: MutatingAdmissionWebhook
256         configuration:
257           apiVersion: apiserver.config.k8s.io/v1
258           kind: WebhookAdmissionConfiguration
259           kubeConfigFile: /etc/kubernetes/admission-control/cmk-webhook.conf
260   when:
261     - inventory_hostname == groups['kube-master'][0]
262
263
264 - name: restart kube-apiserver after updating admission control configuration
265   when: inventory_hostname == groups['kube-master'][0]
266   block:
267     - name: remove kube-apiserver container
268       # noqa 305 - shell is used intentionally here
269       shell: >-
270         {{ (container_runtime == 'docker') | ternary('docker ps -af name=k8s_kube-apiserver* -q |
271         xargs --no-run-if-empty docker rm -f',
272         'crictl ps -a --name=kube-apiserver* -q |
273         xargs --no-run-if-empty crictl rm -f')  }}
274       args:
275         executable: /bin/bash
276       register: remove_apiserver_container
277       retries: 10
278       until: remove_apiserver_container.rc == 0
279       delay: 1
280     - name: wait for kube-apiserver to be up
281       uri:
282         url: "https://127.0.0.1:6443/healthz"
283         client_cert: "/etc/kubernetes/ssl/ca.crt"
284         client_key: "/etc/kubernetes/ssl/ca.key"
285         validate_certs: no
286       register: result
287       until: result.status == 200
288       retries: 120
289       delay: 1
290
291 - name: create Helm charts directory if needed
292   file:
293     path: /usr/src/charts
294     state: directory
295     mode: 0755
296   when:
297     - inventory_hostname == groups['kube-master'][0]
298
299 - name: copy CMK Helm chart to the controller node
300   copy:
301     src: "{{ role_path }}/charts/cpu-manager-for-kubernetes"
302     dest: "/usr/src/charts/"
303     mode: 0755
304   when:
305     - inventory_hostname == groups['kube-master'][0]
306
307 # adds all kube-nodes to the list of CMK nodes
308 - name: build list of CMK hosts
309   set_fact:
310     cmk_hosts_list: "{{ groups['kube-node'] | join(',') }}"
311   when:
312     - not cmk_use_all_hosts
313     - (cmk_hosts_list is undefined) or (cmk_hosts_list | length == 0)
314
315 - name: set values for CMK Helm chart values
316   set_fact:
317     cmk_image: "{{ registry_local_address }}/cmk"
318     cmk_tag: "{{ cmk_img_version }}"
319   when:
320     - inventory_hostname == groups['kube-master'][0]
321
322 - name: read ca cert
323   command: cat ca.crt
324   args:
325     chdir: "/etc/kubernetes/ssl/"
326   register: ca_cert
327   when:
328     - inventory_hostname == groups['kube-master'][0]
329
330 - name: load ca cert
331   set_fact:
332     caBundle_cert: "{{ ca_cert.stdout | b64encode }}"
333   when:
334     - inventory_hostname == groups['kube-master'][0]
335
336 - name: populate CMK Helm chart values template and push to controller node
337   template:
338     src: "helm_values.yml.j2"
339     dest: "/usr/src/charts/cmk-values.yml"
340     force: yes
341     mode: preserve
342   when:
343     - inventory_hostname == groups['kube-master'][0]
344
345 # remove any pre-existing configmaps before cmk redeployment
346 - name: remove any pre-existing configmaps before CMK deployment
347   command: kubectl delete cm cmk-config-{{ inventory_hostname }}
348   when:
349     - inventory_hostname in (cmk_hosts_list.split(',') if (cmk_hosts_list is defined and cmk_hosts_list | length > 0) else [])
350   delegate_to: "{{ groups['kube-master']|first }}"
351   failed_when: false
352
353 - name: install CMK helm chart
354   command: helm upgrade --install cmk --namespace {{ cmk_namespace }} -f /usr/src/charts/cmk-values.yml /usr/src/charts/cpu-manager-for-kubernetes
355   when:
356     - inventory_hostname == groups['kube-master'][0]
357
358 - name: clean up any certs/key/CSR files
359   file: path=/etc/ssl/cmk state=absent
360   when: inventory_hostname == groups['kube-master'][0]
361   failed_when: false
362   become: yes