Skip to content

Commit a5cb656

Browse files
committed
Add playbook to prepare seed SNO before seeed gen
1 parent 8ff7cd2 commit a5cb656

1 file changed

Lines changed: 186 additions & 0 deletions

File tree

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
---
2+
# Prepares the seed SNO for IBU seed image generation.
3+
#
4+
# This playbook:
5+
# 1. Retrieves the seed spoke kubeconfig from ACM on the hub cluster
6+
# 2. Attaches a dedicated container storage disk to the seed SNO VM
7+
# 3. Configures shared container storage mount on the seed SNO
8+
#
9+
# Prerequisites:
10+
# - The containers qcow2 disk must already exist on the hypervisor
11+
# (one-time manual step: qemu-img create -f qcow2 /var/lib/libvirt/images/<vm>-containers.qcow2 100G)
12+
# - The seed SNO must be deployed and managed by ACM on the hub cluster
13+
#
14+
# This playbook is intended to run before seed generation tests.
15+
#
16+
# Usage:
17+
# ansible-playbook playbooks/ran/prepare-ibu-seed-sno.yml \
18+
# -i inventories/cnf/switch-config.yaml \
19+
# --extra-vars 'hub_cluster=kni-qe-108 spoke_cluster=ibu-seed seed_vm_name=master-0.kni-qe-108'
20+
#
21+
# Parameters:
22+
# hub_cluster: Hub cluster name (required)
23+
# spoke_cluster: Spoke cluster name (required)
24+
# seed_vm_name: VM name on hypervisor (required)
25+
26+
- name: Retrieve spoke kubeconfig from hub cluster
27+
hosts: bastion
28+
vars:
29+
hub_kubeconfig: "/home/telcov10n/project/generated/{{ hub_cluster }}/auth/kubeconfig"
30+
seed_kubeconfig: "/tmp/{{ spoke_cluster }}-kubeconfig"
31+
tasks:
32+
- name: Assert required variables are defined
33+
ansible.builtin.assert:
34+
that:
35+
- hub_cluster is defined
36+
- spoke_cluster is defined
37+
- hub_kubeconfig is defined
38+
- seed_kubeconfig is defined
39+
fail_msg: >-
40+
hub_cluster and spoke_cluster must be provided as extra-vars
41+
42+
- name: Check hub kubeconfig exists
43+
ansible.builtin.stat:
44+
path: "{{ hub_kubeconfig }}"
45+
register: hub_kubeconfig_stat
46+
47+
- name: Assert hub kubeconfig file exists
48+
ansible.builtin.assert:
49+
that:
50+
- hub_kubeconfig_stat.stat.exists
51+
fail_msg: >-
52+
Hub kubeconfig not found at {{ hub_kubeconfig }}.
53+
Ensure hub cluster is deployed or provide correct hub_kubeconfig path.
54+
55+
- name: Get spoke cluster admin kubeconfig secret
56+
kubernetes.core.k8s_info:
57+
kubeconfig: "{{ hub_kubeconfig }}"
58+
api_version: v1
59+
kind: Secret
60+
namespace: "{{ spoke_cluster }}"
61+
name: "{{ spoke_cluster }}-admin-kubeconfig"
62+
register: spoke_kubeconfig_secret
63+
64+
- name: Extract spoke kubeconfig to specified path
65+
ansible.builtin.copy:
66+
content: "{{ spoke_kubeconfig_secret.resources[0].data.kubeconfig | b64decode }}"
67+
dest: "{{ seed_kubeconfig }}"
68+
mode: '0600'
69+
70+
- name: Attach container storage disk to seed SNO VM
71+
hosts: hypervisor
72+
vars:
73+
seed_kubeconfig: "/tmp/{{ spoke_cluster }}-kubeconfig"
74+
libvirtd_disk_path: /var/lib/libvirt/images
75+
containers_disk_path: "{{ libvirtd_disk_path }}/{{ seed_vm_name }}-containers.qcow2"
76+
tasks:
77+
- name: Assert required variables are defined
78+
ansible.builtin.assert:
79+
that:
80+
- seed_vm_name is defined
81+
- seed_kubeconfig is defined
82+
fail_msg: >-
83+
Both seed_vm_name and seed_kubeconfig must be provided
84+
as extra-vars
85+
86+
- name: Check current VM disk list
87+
ansible.builtin.command: virsh domblklist {{ seed_vm_name }}
88+
register: domblklist
89+
changed_when: false
90+
become: true
91+
92+
- name: Attach containers disk if not already attached
93+
ansible.builtin.command: >-
94+
virsh attach-disk {{ seed_vm_name }}
95+
{{ containers_disk_path }}
96+
vdb
97+
--driver qemu --subdriver qcow2 --persistent
98+
when: containers_disk_path not in domblklist.stdout
99+
changed_when: true
100+
become: true
101+
102+
- name: Configure shared container storage on seed SNO
103+
hosts: bastion
104+
vars:
105+
seed_kubeconfig: "/tmp/{{ spoke_cluster }}-kubeconfig"
106+
tasks:
107+
- name: Get seed SNO node name
108+
kubernetes.core.k8s_info:
109+
kubeconfig: "{{ seed_kubeconfig }}"
110+
kind: Node
111+
register: seed_node
112+
113+
- name: Set seed node name fact
114+
ansible.builtin.set_fact:
115+
seed_node_name: "{{ seed_node.resources[0].metadata.name }}"
116+
117+
- name: Check if vdb is already partitioned
118+
ansible.builtin.command: >-
119+
oc --kubeconfig {{ seed_kubeconfig }}
120+
debug node/{{ seed_node_name }}
121+
-- chroot /host lsblk /dev/vdb -o PARTLABEL
122+
register: vdb_partlabel
123+
changed_when: false
124+
failed_when: false
125+
126+
- name: Partition and format vdb
127+
ansible.builtin.command: >-
128+
oc --kubeconfig {{ seed_kubeconfig }}
129+
debug node/{{ seed_node_name }}
130+
-- chroot /host bash -c
131+
"sgdisk -n 1:0:0 -t 1:8300 -c 1:containers /dev/vdb && mkfs.xfs -f -L containers /dev/vdb1"
132+
when: "'containers' not in vdb_partlabel.stdout"
133+
changed_when: true
134+
135+
- name: Apply var-lib-containers MachineConfig
136+
kubernetes.core.k8s:
137+
kubeconfig: "{{ seed_kubeconfig }}"
138+
state: present
139+
definition:
140+
apiVersion: machineconfiguration.openshift.io/v1
141+
kind: MachineConfig
142+
metadata:
143+
name: 98-var-lib-containers
144+
labels:
145+
machineconfiguration.openshift.io/role: master
146+
spec:
147+
config:
148+
ignition:
149+
version: 3.4.0
150+
systemd:
151+
units:
152+
- name: var-lib-containers.mount
153+
enabled: true
154+
contents: |
155+
[Unit]
156+
Description=Mount /var/lib/containers on dedicated partition
157+
Before=local-fs.target
158+
[Mount]
159+
What=/dev/disk/by-partlabel/containers
160+
Where=/var/lib/containers
161+
Type=xfs
162+
Options=defaults,prjquota
163+
[Install]
164+
WantedBy=local-fs.target
165+
166+
- name: Wait for MachineConfigPool to start updating
167+
kubernetes.core.k8s_info:
168+
kubeconfig: "{{ seed_kubeconfig }}"
169+
kind: MachineConfigPool
170+
name: master
171+
wait: true
172+
wait_condition:
173+
type: Updating
174+
status: "True"
175+
wait_timeout: 120
176+
177+
- name: Wait for MachineConfigPool to finish updating
178+
kubernetes.core.k8s_info:
179+
kubeconfig: "{{ seed_kubeconfig }}"
180+
kind: MachineConfigPool
181+
name: master
182+
wait: true
183+
wait_condition:
184+
type: Updated
185+
status: "True"
186+
wait_timeout: 1200

0 commit comments

Comments
 (0)