|
1 | 1 | --- |
2 | 2 | - hosts: all |
3 | | - become: true |
4 | 3 | 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 |
12 | 6 | roles: |
13 | | - - selinux |
14 | 7 | - epel_repositories |
15 | 8 | 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 |
18 | 37 |
|
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 |
25 | 43 |
|
26 | | - - name: modprobe br_netfilter |
27 | | - modprobe: |
28 | | - name: br_netfilter |
29 | 44 |
|
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 |
38 | 48 |
|
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' |
44 | 54 |
|
45 | | - - name: Configure bridge |
46 | | - nmcli: |
| 55 | + - name: Deploy multus |
| 56 | + kubernetes.core.k8s: |
47 | 57 | 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 |
115 | 59 |
|
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()" |
122 | 64 |
|
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}}" |
163 | 67 | 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 |
197 | 71 |
|
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 |
212 | 79 | metadata: |
213 | | - name: bridge-foreman |
| 80 | + name: kubevirt |
| 81 | + namespace: kubevirt |
214 | 82 | 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 |
236 | 87 |
|
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: |
241 | 92 | apiVersion: v1 |
242 | 93 | kind: ServiceAccount |
243 | 94 | metadata: |
244 | 95 | name: foreman-account |
245 | 96 | 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 |
248 | 103 | kind: ClusterRoleBinding |
249 | 104 | metadata: |
250 | 105 | name: foreman-cluster-admin |
|
253 | 108 | kind: ClusterRole |
254 | 109 | name: cluster-admin |
255 | 110 | 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 |
288 | 114 |
|
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