From 18cfada22a9acd031d3b77ba6132d700b611eedb Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 11 Jul 2020 04:21:12 +0200 Subject: usb installer: add multi-host boot stick support --- roles/installer/debian/preseed/tasks/main.yml | 2 +- roles/installer/debian/usb/tasks/main.yml | 68 +++++++++++++--------- .../installer/debian/usb/templates/syslinux.cfg.j2 | 22 +++++++ .../autoinstall/templates/auto_install.conf.j2 | 2 +- .../openbsd/autoinstall/templates/install.site.j2 | 2 +- 5 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 roles/installer/debian/usb/templates/syslinux.cfg.j2 (limited to 'roles/installer') diff --git a/roles/installer/debian/preseed/tasks/main.yml b/roles/installer/debian/preseed/tasks/main.yml index 2d229aa8..49d08c8b 100644 --- a/roles/installer/debian/preseed/tasks/main.yml +++ b/roles/installer/debian/preseed/tasks/main.yml @@ -21,7 +21,7 @@ user: root manage_dir: no path: "{{ preseed_tmpdir }}/authorized_keys" - key: "{{ ssh_keys_root | join('\n') }}" + key: "{{ hostvars[install_hostname].ssh_keys_root | join('\n') }}" - name: force net interface name policy when: preseed_force_net_ifnames_policy is defined diff --git a/roles/installer/debian/usb/tasks/main.yml b/roles/installer/debian/usb/tasks/main.yml index 44f793e9..6220b02b 100644 --- a/roles/installer/debian/usb/tasks/main.yml +++ b/roles/installer/debian/usb/tasks/main.yml @@ -1,10 +1,12 @@ --- - name: check if usb drive mountpoint exists + run_once: true stat: path: "{{ usb_install_path }}" register: usb_install_mountpoint - name: fail if usb drive mountpoint does not exist + run_once: true assert: that: usb_install_mountpoint.stat.exists msg: the path to the usb drive does not exist @@ -16,16 +18,19 @@ debian_installer_codename: "{{ install_codename }}" debian_installer_arch: "{{ install.arch | default('amd64') }}" debian_installer_variant: netboot + run_once: true import_role: role: installer/debian/fetch - name: Create temporary workdir tempfile: + prefix: "usb-install.{{ install_hostname }}." state: directory register: tmpdir - name: generate pressed file vars: + preseed_orig_initrd: "{{ installer_base_path }}/{{ install_distro }}-{{ install_codename }}/{{ hostvars[install_hostname].install_cooked.arch | default('amd64') }}-netboot/initrd.gz" preseed_tmpdir: "{{ tmpdir.path }}" import_role: name: installer/debian/preseed @@ -36,46 +41,57 @@ dest: "{{ usb_install_path }}/initrd.{{ install_hostname }}.gz" always: - - name: Cleanup temporary workdir - when: tmpdir.path is defined - file: - path: "{{ tmpdir.path }}" - state: absent + - name: Cleanup temporary workdir + when: tmpdir.path is defined + file: + path: "{{ tmpdir.path }}" + state: absent - name: Copy linux kernel image to the USB drive + run_once: true copy: src: "{{ global_cache_dir }}/debian-installer/{{ install_distro }}-{{ install_codename }}/{{ install.arch | default('amd64') }}-{{ debian_installer_variant }}/linux" dest: "{{ usb_install_path }}/" - name: Generate syslinux configuration for BIOS boot - copy: + run_once: true + vars: + syslinux_base_path: "" + template: + src: syslinux.cfg.j2 dest: "{{ usb_install_path }}/syslinux.cfg" - content: | - DEFAULT {{ install_hostname }} - TIMEOUT 100 - PROMPT 1 - - LABEL {{ install_hostname }} - SAY SYSLINUX booting an automated installer for {{ install_hostname }}... - KERNEL linux - INITRD initrd.{{ install_hostname }}.gz - APPEND install {{ (install.kernel_cmdline | default([])) | join(' ') }} - name: create EFI boot directory + run_once: true file: path: "{{ usb_install_path }}/EFI/boot" state: directory - name: Generate syslinux configuration for UEFI boot - copy: + run_once: true + vars: + syslinux_base_path: "../../" + template: + src: syslinux.cfg.j2 dest: "{{ usb_install_path }}/EFI/boot/syslinux.cfg" - content: | - DEFAULT {{ install_hostname }} - TIMEOUT 100 - PROMPT 1 - LABEL {{ install_hostname }} - SAY SYSLINUX booting an automated installer for {{ install_hostname }}... - KERNEL ../../linux - INITRD ../../initrd.{{ install_hostname }}.gz - APPEND install {{ (install.kernel_cmdline | default([])) | join(' ') }} +- name: Make the USB disk bootable + pause: + seconds: 0 + prompt: | + You should make sure the USB disk is bootable and + has syslinux installed. + + $ sudo apt install mbr syslinux + $ sudo install-mbr /dev/CHANGEME + $ sudo syslinux -i /dev/CHANGEME1 + $ sudo fdisk /dev/CHANGEME + [Here, make sure partition 1 is marked bootable.] + + for UEFI these steps need to be done + + $ sudo apt install syslinux-efi + $ cp /usr/lib/syslinux/modules/efi64/* {{ usb_install_path }}/EFI/boot/ + $ cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi {{ usb_install_path }}/EFI/boot/bootx64.efi + + This will NOT be done automatically. diff --git a/roles/installer/debian/usb/templates/syslinux.cfg.j2 b/roles/installer/debian/usb/templates/syslinux.cfg.j2 new file mode 100644 index 00000000..c91f7287 --- /dev/null +++ b/roles/installer/debian/usb/templates/syslinux.cfg.j2 @@ -0,0 +1,22 @@ +SAY ***************************************** +SAY ** +{% if (ansible_play_hosts_all | length) == 1 %} +DEFAULT {{ install_hostname }} +SAY ** will be booting automated installer for {{ install_hostname }} in 10s ... +TIMEOUT 100 +{% else %} +SAY ** Please select host to install: +SAY ** +{% for host in ansible_play_hosts_all %} +SAY ** -> {{ host }} +{% endfor %} +{% endif %} +SAY ** +PROMPT 1 +{% for host in ansible_play_hosts_all %} + +LABEL {{ host }} + KERNEL {{ syslinux_base_path }}linux + INITRD {{ syslinux_base_path }}initrd.{{ host }}.gz + APPEND install {{ (hostvars[host].install_cooked.kernel_cmdline | default([])) | join(' ') }} +{% endfor %} diff --git a/roles/installer/openbsd/autoinstall/templates/auto_install.conf.j2 b/roles/installer/openbsd/autoinstall/templates/auto_install.conf.j2 index 767242d9..6c23d753 100644 --- a/roles/installer/openbsd/autoinstall/templates/auto_install.conf.j2 +++ b/roles/installer/openbsd/autoinstall/templates/auto_install.conf.j2 @@ -17,7 +17,7 @@ Which speed should {{ obsd_autoinstall_serial_device }} use = {{ obsd_autoinstal {% endif %} {# we will install only one key for now, install.site will install the rest #} -Public ssh key for root account = {{ ssh_keys_root[0] }} +Public ssh key for root account = {{ hostvars[install_hostname].ssh_keys_root[0] }} Password for root = this-very-very-secure-password-will-be-overwritten-by-install.site Setup a user = no Start sshd(8) by default = yes diff --git a/roles/installer/openbsd/autoinstall/templates/install.site.j2 b/roles/installer/openbsd/autoinstall/templates/install.site.j2 index 974b516a..32b33ea9 100644 --- a/roles/installer/openbsd/autoinstall/templates/install.site.j2 +++ b/roles/installer/openbsd/autoinstall/templates/install.site.j2 @@ -5,7 +5,7 @@ usermod -p "$(openssl rand -base64 24 | encrypt)" root echo "Installing SSH keys for root" cat < /root/.ssh/authorized_keys -{{ ssh_keys_root | join('\n') }} +{{ hostvars[install_hostname].ssh_keys_root | join('\n') }} EOF {% if hostvars[install_hostname].ansible_port is defined %} -- cgit v1.2.3