Skip to content

Commit 0a194bf

Browse files
committed
update kubevirt playbook to work on el9
1 parent 019413c commit 0a194bf

3 files changed

Lines changed: 106 additions & 263 deletions

File tree

playbooks/kubevirt.yml

Lines changed: 105 additions & 258 deletions
Original file line numberDiff line numberDiff line change
@@ -1,250 +1,105 @@
11
---
22
- hosts: all
3-
become: true
43
vars:
5-
selinux_state: permissive
6-
kubernetes_version: 1.13.5
7-
pod_network: 10.244.0.0/16
8-
flannel_version: a70459be0084506e4ec919aa1c114638878db11b
9-
network_operator: 0.7.0
10-
kubevirt_version: v0.16.3
11-
ovs_cni_version: master
4+
minikube_version: v1.38.0 # or latest
5+
multus_version: v4.2.3 # or master
126
roles:
13-
- selinux
147
- epel_repositories
158
tasks:
16-
- name: disable swap
17-
command: swapoff -a
9+
- name: install podman
10+
ansible.builtin.package:
11+
name: podman
12+
become: true
13+
14+
- name: install minikube
15+
ansible.builtin.package:
16+
name: https://storage.googleapis.com/minikube/releases/{{ minikube_version }}/minikube-latest.x86_64.rpm
17+
disable_gpg_check: true
18+
become: true
19+
20+
- name: install python-kubernetes
21+
ansible.builtin.package:
22+
name: python3-kubernetes
23+
become: true
24+
25+
- name: use minikube for kubectl
26+
ansible.builtin.file:
27+
src: /usr/bin/minikube
28+
dest: /usr/local/bin/kubectl
29+
state: link
30+
become: true
31+
32+
- name: check minikube status
33+
ansible.builtin.command: minikube status --output=json
34+
ignore_errors: true
35+
changed_when: false
36+
register: _minikube_status
1837

19-
- name: deconfigure swap
20-
mount:
21-
src: /swapfile
22-
fstype: swap
23-
path: none
24-
state: absent
38+
# {"Name":"minikube","Host":"Running","Kubelet":"Running","APIServer":"Running","Kubeconfig":"Configured","Worker":false}
39+
# will error with non-zero if no cluster defined
40+
- name: deploy basic minikube cluster
41+
ansible.builtin.command: minikube start --cni=flannel
42+
when: _minikube_status is failed or 'Running' not in _minikube_status.stdout
2543

26-
- name: modprobe br_netfilter
27-
modprobe:
28-
name: br_netfilter
2944

30-
- name: configure bridge iptables
31-
sysctl:
32-
name: "{{ item }}"
33-
value: 1
34-
sysctl_file: /etc/sysctl.d/k8s.conf
35-
with_items:
36-
- net.bridge.bridge-nf-call-ip6tables
37-
- net.bridge.bridge-nf-call-iptables
45+
- name: Get Cluster information
46+
kubernetes.core.k8s_cluster_info:
47+
register: _api_status
3848

39-
- name: install needed network manager libs
40-
yum:
41-
name:
42-
- NetworkManager-glib
43-
- NetworkManager
49+
- name: Download multus-daemonset manifest to the cluster
50+
ansible.builtin.get_url:
51+
url: https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/{{ multus_version }}/deployments/multus-daemonset.yml
52+
dest: ~/multus-daemonset.yml
53+
mode: '0664'
4454

45-
- name: Configure bridge
46-
nmcli:
55+
- name: Deploy multus
56+
kubernetes.core.k8s:
4757
state: present
48-
type: bridge
49-
conn_name: foreman
50-
51-
- name: install docker
52-
yum:
53-
name: docker
54-
55-
- name: enable docker
56-
service:
57-
name: docker
58-
enabled: true
59-
state: started
60-
61-
- name: k8s repo
62-
yum_repository:
63-
name: kubernetes
64-
description: Kubernetes
65-
baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
66-
enabled: yes
67-
gpgcheck: yes
68-
repo_gpgcheck: yes
69-
gpgkey: https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
70-
exclude: kube*
71-
72-
- name: install kubelet kubeadm kubectl
73-
yum:
74-
name:
75-
- kubelet-{{ kubernetes_version }}
76-
- kubeadm-{{ kubernetes_version }}
77-
- kubectl-{{ kubernetes_version }}
78-
disable_excludes: kubernetes
79-
80-
- name: create /etc/systemd/system/kubelet.service.d/
81-
file:
82-
path: /etc/systemd/system/kubelet.service.d/
83-
state: directory
84-
85-
- name: enable kubelet accounting
86-
copy:
87-
dest: /etc/systemd/system/kubelet.service.d/11-cgroups.conf
88-
content: |
89-
[Service]
90-
CPUAccounting=true
91-
MemoryAccounting=true
92-
93-
- name: reload systemd
94-
systemd:
95-
daemon_reload: yes
96-
97-
- name: enable kubelet
98-
service:
99-
name: kubelet
100-
enabled: true
101-
state: started
102-
103-
- name: init cluster
104-
command: kubeadm init --pod-network-cidr={{ pod_network }} --apiserver-advertise-address={{ ansible_eth0['ipv4']['address'] }}
105-
args:
106-
creates: /etc/kubernetes/admin.conf
107-
108-
- name: untaint master
109-
command: kubectl taint nodes --all node-role.kubernetes.io/master-
110-
register: untaint_master
111-
failed_when: false
112-
changed_when: untaint_master.rc == 0
113-
environment:
114-
KUBECONFIG: /etc/kubernetes/admin.conf
58+
src: ~/multus-daemonset.yml
11559

116-
- name: deploy flannel
117-
command: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/{{ flannel_version }}/Documentation/kube-flannel.yml
118-
args:
119-
creates: /etc/cni/net.d/10-flannel.conflist
120-
environment:
121-
KUBECONFIG: /etc/kubernetes/admin.conf
60+
- name: deploy kubevirt
61+
ansible.builtin.command: minikube addons enable kubevirt
62+
when:
63+
- "'kubevirt.io/v1' not in _api_status.apis.keys()"
12264

123-
- name: deploy network namespace
124-
command: kubectl apply -f https://github.com/kubevirt/cluster-network-addons-operator/releases/download/{{ network_operator }}/namespace.yaml
125-
args:
126-
creates: /etc/cni/net.d/multus.d/multus.kubeconfig
127-
environment:
128-
KUBECONFIG: /etc/kubernetes/admin.conf
129-
130-
- name: deploy network crd
131-
command: kubectl apply -f https://github.com/kubevirt/cluster-network-addons-operator/releases/download/{{ network_operator }}/network-addons-config.crd.yaml
132-
args:
133-
creates: /etc/cni/net.d/multus.d/multus.kubeconfig
134-
environment:
135-
KUBECONFIG: /etc/kubernetes/admin.conf
136-
137-
- name: deploy network operator
138-
command: kubectl apply -f https://github.com/kubevirt/cluster-network-addons-operator/releases/download/{{ network_operator }}/operator.yaml
139-
args:
140-
creates: /etc/cni/net.d/multus.d/multus.kubeconfig
141-
environment:
142-
KUBECONFIG: /etc/kubernetes/admin.conf
143-
144-
- name: deploy kubevirt operator
145-
command: kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/{{ kubevirt_version }}/kubevirt-operator.yaml
146-
args:
147-
creates: /var/lib/kubelet/device-plugins/kubevirt-tun.sock
148-
environment:
149-
KUBECONFIG: /etc/kubernetes/admin.conf
150-
151-
- name: deploy kubevirt cr
152-
command: kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/{{ kubevirt_version }}/kubevirt-cr.yaml
153-
args:
154-
creates: /var/lib/kubelet/device-plugins/kubevirt-tun.sock
155-
environment:
156-
KUBECONFIG: /etc/kubernetes/admin.conf
157-
158-
- name: check for NetworkAddonsConfig
159-
command: kubectl get networkaddonsconfigs cluster
160-
environment:
161-
KUBECONFIG: /etc/kubernetes/admin.conf
162-
failed_when: false
65+
- name: wait for deployment to finish
66+
ansible.builtin.command: !unsafe kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt --template="{{.status.phase}}"
16367
changed_when: false
164-
register: netaddonsconfig
165-
166-
- name: prepare NetworkAddonsConfig file
167-
copy:
168-
dest: /tmp/netaddonsconfig
169-
content: |
170-
apiVersion: networkaddonsoperator.network.kubevirt.io/v1alpha1
171-
kind: NetworkAddonsConfig
172-
metadata:
173-
name: cluster
174-
spec:
175-
imagePullPolicy: Always
176-
kubeMacPool: {}
177-
multus: {}
178-
linuxBridge: {}
179-
when: netaddonsconfig.rc != 0
180-
181-
- name: create NetworkAddonsConfig
182-
command: kubectl create -f /tmp/netaddonsconfig
183-
environment:
184-
KUBECONFIG: /etc/kubernetes/admin.conf
185-
when: netaddonsconfig.rc != 0
186-
187-
- name: install virtctl
188-
get_url:
189-
url: https://github.com/kubevirt/kubevirt/releases/download/{{ kubevirt_version }}/virtctl-{{ kubevirt_version }}-linux-amd64
190-
dest: /usr/bin/virtctl
191-
mode: u=rwx,g=rx,o=rx
192-
193-
- name: wait for the network to be ready
194-
command: kubectl wait networkaddonsconfig cluster --for condition=Ready --timeout=300s
195-
environment:
196-
KUBECONFIG: /etc/kubernetes/admin.conf
68+
register: _kubevirt_status
69+
until: _kubevirt_status.stdout == 'Deployed'
70+
retries: 100
19771

198-
- name: check for bridge-foreman NetworkAttachmentDefinition
199-
command: kubectl get net-attach-def bridge-foreman
200-
environment:
201-
KUBECONFIG: /etc/kubernetes/admin.conf
202-
failed_when: false
203-
changed_when: false
204-
register: bridge_foreman_net_attach
205-
206-
- name: prepare bridge-foreman NetworkAttachmentDefinition file
207-
copy:
208-
dest: /tmp/bridge-foreman-net-attach-def
209-
content: |
210-
apiVersion: "k8s.cni.cncf.io/v1"
211-
kind: NetworkAttachmentDefinition
72+
- name: Enable HostDisk feature gate
73+
# https://kubevirt.io/user-guide/cluster_admin/activating_feature_gates/
74+
kubernetes.core.k8s:
75+
state: present
76+
definition:
77+
apiVersion: kubevirt.io/v1
78+
kind: KubeVirt
21279
metadata:
213-
name: bridge-foreman
80+
name: kubevirt
81+
namespace: kubevirt
21482
spec:
215-
config: '{
216-
"cniVersion": "0.3.1",
217-
"type": "bridge",
218-
"bridge": "foreman",
219-
"ipam": {}
220-
}'
221-
when: bridge_foreman_net_attach.rc != 0
222-
223-
- name: create bridge-foreman NetworkAttachmentDefinition
224-
command: kubectl create -f /tmp/bridge-foreman-net-attach-def
225-
environment:
226-
KUBECONFIG: /etc/kubernetes/admin.conf
227-
when: bridge_foreman_net_attach.rc != 0
228-
229-
- name: check for foreman-account ServiceAccount
230-
command: kubectl get sa foreman-account
231-
environment:
232-
KUBECONFIG: /etc/kubernetes/admin.conf
233-
failed_when: false
234-
changed_when: false
235-
register: foreman_service_sa
83+
configuration:
84+
developerConfiguration:
85+
featureGates:
86+
- HostDisk
23687

237-
- name: prepare foreman-account ServiceAccount file
238-
copy:
239-
dest: /tmp/foreman-account-sa
240-
content: |
88+
- name: Create ServiceAccount foreman-account
89+
kubernetes.core.k8s:
90+
state: present
91+
definition:
24192
apiVersion: v1
24293
kind: ServiceAccount
24394
metadata:
24495
name: foreman-account
24596
namespace: default
246-
---
247-
apiVersion: rbac.authorization.k8s.io/v1
97+
98+
- name: Create ClusterRoleBinding for foreman-account to get cluster-admin
99+
kubernetes.core.k8s:
100+
state: present
101+
definition:
102+
apiVersion: v1
248103
kind: ClusterRoleBinding
249104
metadata:
250105
name: foreman-cluster-admin
@@ -253,39 +108,31 @@
253108
kind: ClusterRole
254109
name: cluster-admin
255110
subjects:
256-
- kind: ServiceAccount
257-
name: foreman-account
258-
namespace: default
259-
when: foreman_service_sa.rc != 0
260-
261-
- name: create foreman-account ServiceAccount
262-
command: kubectl create -f /tmp/foreman-account-sa
263-
environment:
264-
KUBECONFIG: /etc/kubernetes/admin.conf
265-
when: foreman_service_sa.rc != 0
266-
267-
- name: create /home/vagrant/.kube
268-
file:
269-
path: /home/vagrant/.kube
270-
state: directory
271-
owner: vagrant
272-
group: vagrant
273-
274-
- name: deploy kube config
275-
copy:
276-
src: /etc/kubernetes/admin.conf
277-
dest: /home/vagrant/.kube/config
278-
remote_src: yes
279-
owner: vagrant
280-
group: vagrant
281-
282-
- name: get foreman-account secret
283-
shell: "set -o pipefail && kubectl get secrets $(kubectl get sa foreman-account -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 -d | xargs"
284-
environment:
285-
KUBECONFIG: /etc/kubernetes/admin.conf
286-
changed_when: false
287-
register: foreman_account_secret
111+
- kind: ServiceAccount
112+
name: foreman-account
113+
namespace: default
288114

289-
- name: show foreman-account secret
290-
debug:
291-
msg: "{{ foreman_account_secret.stdout }}"
115+
- name: token
116+
kubernetes.core.k8s:
117+
state: present
118+
definition:
119+
apiVersion: v1
120+
kind: Secret
121+
metadata:
122+
name: my-sa-token
123+
namespace: default
124+
annotations:
125+
kubernetes.io/service-account.name: foreman-account
126+
type: kubernetes.io/service-account-token
127+
128+
- name: Get foreman-account secret
129+
kubernetes.core.k8s_info:
130+
api_version: v1
131+
kind: Secret
132+
name: my-sa-token
133+
namespace: default
134+
register: _sa_token
135+
136+
- name: Show foreman-account secret
137+
ansible.builtin.debug:
138+
msg: "{{ _sa_token.resources[0].data.token | b64decode }}"

0 commit comments

Comments
 (0)