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