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