|
27 | 27 |
|
28 | 28 | - name: Set run files directory for the current run run_id={{ run_id }} |
29 | 29 | ansible.builtin.set_fact: |
30 | | - run_files_path: "{{ runtime_root }}/{{ run_id }}" |
| 30 | + bootstrap_run_files_path: "{{ runtime_root }}/{{ run_id }}" |
31 | 31 |
|
32 | 32 | - name: Create the run files directory run_id={{ run_id }} |
33 | 33 | ansible.builtin.file: |
34 | | - path: "{{ run_files_path }}" |
| 34 | + path: "{{ bootstrap_run_files_path }}" |
35 | 35 | state: directory |
36 | 36 | mode: '0755' |
37 | 37 |
|
|
108 | 108 | ansible.builtin.shell: | |
109 | 109 | # Enable Bash safety only if running under Bash. |
110 | 110 | [ -n "$BASH_VERSION" ] && eval "set -eo pipefail" |
111 | | - |
| 111 | +
|
112 | 112 | CID="" |
113 | 113 | TMP_DIR="" |
114 | 114 | LOOPDEV="" |
115 | | - |
| 115 | +
|
116 | 116 | cleanup() { |
117 | 117 | EXIT_STATUS=$? |
118 | 118 | [ "$EXIT_STATUS" -ne 0 ] && rm -rf "{{ disk_image }}" || : |
|
123 | 123 | rm -rf "$TMP_DIR" || : |
124 | 124 | fi |
125 | 125 | } |
126 | | - |
| 126 | +
|
127 | 127 | # Trigger cleanup at exit. |
128 | 128 | trap cleanup EXIT |
129 | | - |
| 129 | +
|
130 | 130 | # Create an initial empty disk image. |
131 | 131 | truncate -s 5G "{{ disk_image }}" |
132 | 132 | mkfs.ext4 -F "{{ disk_image }}" |
133 | | - |
| 133 | +
|
134 | 134 | # Create container. |
135 | 135 | CID=$(docker create "{{ item.rootfs }}" /bin/sh) || exit 1 |
136 | | - |
| 136 | +
|
137 | 137 | # Create a temporary directory. |
138 | 138 | TMP_DIR=$(mktemp -d) || exit 1 |
139 | | - |
| 139 | +
|
140 | 140 | # Attach loop device explicitly |
141 | 141 | LOOPDEV=$(losetup -f --show "{{ disk_image }}") |
142 | 142 |
|
143 | 143 | # Mount disk on a loop device and copy the image content into the disk. |
144 | 144 | mount -o loop "{{ disk_image }}" "$TMP_DIR" |
145 | 145 | docker export "$CID" | tar -C "$TMP_DIR" -xf - |
146 | | - |
| 146 | +
|
147 | 147 | # Finalize and check disk integrity. |
148 | 148 | sync |
149 | 149 | umount "$TMP_DIR" |
|
155 | 155 | vars: |
156 | 156 | rootfs_basename: "{{ item.rootfs | basename | regex_replace(':', '.') }}" |
157 | 157 | original_image: "{{ cached_files_path }}/{{ rootfs_basename }}.ext4" |
158 | | - working_image: "{{ run_files_path }}/{{ rootfs_basename }}.ext4" |
| 158 | + working_image: "{{ bootstrap_run_files_path }}/{{ rootfs_basename }}.ext4" |
159 | 159 | # Create a lightweight CoW clone (if fs supports reflinks) and preserve raw disk sparseness. |
160 | 160 | ansible.builtin.command: > |
161 | 161 | cp --sparse=always --reflink=auto "{{ original_image }}" "{{ working_image }}" |
|
168 | 168 | - name: Setup ssh inside rootfs ext4 image clones |
169 | 169 | vars: |
170 | 170 | rootfs_basename: "{{ item.rootfs | basename | regex_replace(':', '.') }}" |
171 | | - disk_image: "{{ run_files_path }}/{{ rootfs_basename }}.ext4" |
| 171 | + disk_image: "{{ bootstrap_run_files_path }}/{{ rootfs_basename }}.ext4" |
172 | 172 | become: true |
173 | 173 | block: |
174 | 174 | - name: Ensure filesystem is clean before modifying rootfs ext4 image clones |
|
191 | 191 | loop: "{{ machines | union(builders) }}" |
192 | 192 | when: item.arch == ansible_facts['architecture'] |
193 | 193 |
|
194 | | -- import_role: |
| 194 | +- name: Run common/tasks/compute_tap_dev_map.yml |
| 195 | + ansible.builtin.import_role: |
195 | 196 | name: common |
196 | 197 | tasks_from: compute_tap_dev_map |
197 | 198 |
|
198 | 199 | - name: Verify any conflict in tap device map |
199 | 200 | ansible.builtin.command: > |
200 | | - "{{ role_path }}/files/check_net_conflicts.sh" {{ tap_dev_map | to_json | quote }} |
| 201 | + "{{ role_path }}/files/check_net_conflicts.sh" {{ common_tap_dev_map | to_json | quote }} |
201 | 202 | changed_when: false |
202 | 203 |
|
203 | 204 | - name: Create and configure tap devices for VMs |
204 | 205 | become: true |
205 | 206 | block: |
206 | 207 | - name: Create tap devices |
207 | 208 | vars: |
208 | | - tap_dev_name: "{{ tap_dev_map[item.name].name }}" |
| 209 | + tap_dev_name: "{{ common_tap_dev_map[item.name].name }}" |
209 | 210 | ansible.builtin.command: ip tuntap add dev "{{ tap_dev_name }}" mode tap |
210 | 211 | args: |
211 | 212 | creates: "/sys/class/net/{{ tap_dev_name }}/ifindex" |
|
214 | 215 |
|
215 | 216 | - name: Set tap devices up |
216 | 217 | vars: |
217 | | - tap_dev_name: "{{ tap_dev_map[item.name].name }}" |
| 218 | + tap_dev_name: "{{ common_tap_dev_map[item.name].name }}" |
218 | 219 | ansible.builtin.command: ip link set "{{ tap_dev_name }}" up |
219 | 220 | loop: "{{ machines | union(builders) }}" |
220 | 221 | when: item.arch == ansible_facts["architecture"] |
221 | 222 | changed_when: false |
222 | 223 |
|
223 | 224 | - name: Set IP addresses on tap devices |
224 | 225 | vars: |
225 | | - tap_dev_name: "{{ tap_dev_map[item.name].name }}" |
226 | | - ip_addr: "{{ tap_dev_map[item.name].host_ip }}/30" |
227 | | - ansible.builtin.shell: | |
228 | | - ip -o addr show dev "{{ tap_dev_name }}" | grep -q "{{ ip_addr }}" || \ |
229 | | - ip addr add "{{ ip_addr }}" dev "{{ tap_dev_name }}" |
| 226 | + tap_dev_name: "{{ common_tap_dev_map[item.name].name }}" |
| 227 | + ip_addr: "{{ common_tap_dev_map[item.name].host_ip }}/30" |
| 228 | + ansible.builtin.command: ip addr add "{{ ip_addr }}" dev "{{ tap_dev_name }}" |
230 | 229 | loop: "{{ machines | union(builders) }}" |
231 | | - when: item.arch == ansible_facts["architecture"] |
| 230 | + when: |
| 231 | + - item.arch == ansible_facts["architecture"] |
| 232 | + - ip_addr not in lookup('pipe', 'ip -o addr show dev ' ~ tap_dev_name) |
| 233 | + changed_when: true |
232 | 234 |
|
233 | 235 | - name: Start dnsmasq services |
234 | 236 | become: true |
|
240 | 242 | owner: root |
241 | 243 | group: root |
242 | 244 | mode: "0644" |
243 | | - register: unit_file |
| 245 | + notify: Reload systemd |
244 | 246 |
|
245 | | - - name: Reload systemd units |
246 | | - ansible.builtin.systemd: |
247 | | - daemon_reload: true |
248 | | - when: unit_file.changed |
| 247 | + - name: Execute notified systemd reloading handler |
| 248 | + ansible.builtin.meta: flush_handlers |
249 | 249 |
|
250 | 250 | - name: Start dnsmasq service on each tap device |
251 | 251 | vars: |
252 | | - tap_dev_name: "{{ tap_dev_map[item.name].name }}" |
253 | | - host_ip: "{{ tap_dev_map[item.name].host_ip }}" |
254 | | - guest_ip: "{{ tap_dev_map[item.name].guest_ip }}" |
| 252 | + tap_dev_name: "{{ common_tap_dev_map[item.name].name }}" |
| 253 | + host_ip: "{{ common_tap_dev_map[item.name].host_ip }}" |
| 254 | + guest_ip: "{{ common_tap_dev_map[item.name].guest_ip }}" |
255 | 255 | ansible.builtin.systemd: |
256 | 256 | name: "dnsmasq-tap@{{ tap_dev_name }}:{{ host_ip }}:{{ guest_ip }}" |
257 | 257 | state: started |
|
264 | 264 | rootfs_basename: "{{ item.rootfs | basename | regex_replace(':', '.') }}" |
265 | 265 | vmlinux_path: "{{ cached_files_path }}/{{ kernel_basename }}.vmlinux" |
266 | 266 | initrd_path: "{{ cached_files_path }}/{{ kernel_basename }}.initrd" |
267 | | - rootfs_disk_path: "{{ run_files_path }}/{{ rootfs_basename }}.ext4" |
268 | | - tap_dev_name: "{{ tap_dev_map[item.name].name }}" |
| 267 | + rootfs_disk_path: "{{ bootstrap_run_files_path }}/{{ rootfs_basename }}.ext4" |
| 268 | + tap_dev_name: "{{ common_tap_dev_map[item.name].name }}" |
269 | 269 | ansible.builtin.template: |
270 | 270 | src: vmconfig.json.j2 |
271 | | - dest: "{{ run_files_path }}/{{ item.name }}.json" |
| 271 | + dest: "{{ bootstrap_run_files_path }}/{{ item.name }}.json" |
272 | 272 | mode: '0755' |
273 | 273 | loop: "{{ machines | union(builders) }}" |
274 | 274 | when: item.arch == ansible_facts["architecture"] |
275 | 275 |
|
276 | 276 | - name: Create virtual machines run_id={{ run_id }} |
277 | 277 | vars: |
278 | 278 | vm_name: "{{ item.name | regex_replace('[.]', '-') }}-{{ run_id }}" |
279 | | - vm_config_path: "{{ run_files_path }}/{{ item.name }}.json" |
| 279 | + vm_config_path: "{{ bootstrap_run_files_path }}/{{ item.name }}.json" |
280 | 280 | vm_socket_path: "/tmp/{{ run_id }}-{{ item.name }}.sock" |
281 | | - vm_logs_path: "{{ run_files_path }}/{{ item.name }}.log" |
| 281 | + vm_logs_path: "{{ bootstrap_run_files_path }}/{{ item.name }}.log" |
282 | 282 | ansible.builtin.shell: > |
283 | 283 | RUST_LOG=debug nohup firecracker \ |
284 | 284 | --no-seccomp \ |
|
0 commit comments